#!/usr/bin/env bash
#
# Конвертация PNG → WebP lossless.
# apt install -y webp
# Использование:
#   ./webp.sh <путь_к_каталогу> [--lossy <качество>] [--keep-png] [--no-backup]
#
# Примеры:
#   ./webp.sh /var/www/pw_web_sait/lk/Frontend/public/class_icons
#   ./webp.sh /some/path --lossy 90
#   ./webp.sh /some/path --keep-png
#
# По умолчанию:
#   - lossless WebP (без потери качества)
#   - PNG-файлы удаляются после успешной конвертации
#   - делается бэкап каталога в <каталог>_backup_<timestamp>
#
# Флаги:
#   --lossy <N>   Lossy-режим с качеством N (0-100). По умолчанию lossless.
#                 Для иконок/логотипов q=90 даёт ещё ~40% экономии без видимой разницы.
#   --keep-png    Не удалять исходные PNG после конвертации.
#   --no-backup   Не создавать бэкап.
#   -h|--help     Справка.

set -u

# --- Аргументы ---
BACKUP=1
KEEP_PNG=0
QUALITY=""
DIR=""

while [ $# -gt 0 ]; do
    case "$1" in
        --no-backup)
            BACKUP=0
            shift
            ;;
        --keep-png)
            KEEP_PNG=1
            shift
            ;;
        --lossy)
            if [ -z "${2:-}" ]; then
                echo "Ошибка: --lossy требует аргумент (0-100)" >&2
                exit 1
            fi
            QUALITY="$2"
            shift 2
            ;;
        -h|--help)
            grep '^#' "$0" | sed 's/^# \{0,1\}//'
            exit 0
            ;;
        -*)
            echo "Ошибка: неизвестный флаг: $1" >&2
            exit 1
            ;;
        *)
            if [ -z "$DIR" ]; then
                DIR="$1"
            else
                echo "Ошибка: лишний аргумент: $1" >&2
                exit 1
            fi
            shift
            ;;
    esac
done

if [ -z "$DIR" ]; then
    echo "Использование: $0 <путь_к_каталогу> [--lossy <N>] [--keep-png] [--no-backup]" >&2
    exit 1
fi

if [ ! -d "$DIR" ]; then
    echo "Ошибка: каталог не найден: $DIR" >&2
    exit 1
fi

# Валидация quality
if [ -n "$QUALITY" ]; then
    if ! [[ "$QUALITY" =~ ^[0-9]+$ ]] || [ "$QUALITY" -lt 0 ] || [ "$QUALITY" -gt 100 ]; then
        echo "Ошибка: --lossy должен быть числом 0-100" >&2
        exit 1
    fi
fi

# --- Проверка зависимостей ---
if ! command -v cwebp >/dev/null 2>&1; then
    echo "Не установлена утилита cwebp." >&2
    echo "Установка:" >&2
    echo "  apt install -y webp" >&2
    exit 1
fi

# --- Нормализуем путь ---
DIR="${DIR%/}"

# --- Список PNG в каталоге (без рекурсии) ---
shopt -s nullglob
files=("$DIR"/*.png)
shopt -u nullglob

if [ ${#files[@]} -eq 0 ]; then
    echo "В каталоге нет PNG-файлов: $DIR"
    exit 0
fi

# --- Размер до ---
size_before=$(du -sb "$DIR" | awk '{print $1}')
human_before=$(du -sh "$DIR" | awk '{print $1}')

# --- Бэкап ---
backup_dir=""

if [ "$BACKUP" -eq 1 ]; then
    backup_dir="${DIR}_backup_$(date +%Y%m%d_%H%M%S)"
    cp -a "$DIR" "$backup_dir"
    echo "Бэкап: $backup_dir"
fi

# --- Режим ---
if [ -n "$QUALITY" ]; then
    mode_label="lossy q=$QUALITY"
else
    mode_label="lossless"
fi

# --- Обработка ---
total=${#files[@]}
ok=0
skipped=0
failed=0

echo "Конвертация $total файлов в: $DIR"
echo "Режим: $mode_label"
if [ "$KEEP_PNG" -eq 1 ]; then
    echo "Исходные PNG: сохраняются"
else
    echo "Исходные PNG: будут удалены после успешной конвертации"
fi
echo

for file in "${files[@]}"; do
    name=$(basename "$file")
    base="${name%.png}"
    out="$DIR/$base.webp"

    if [ -f "$out" ]; then
        echo "  [ПРОПУСК] $name — $base.webp уже существует"
        skipped=$((skipped + 1))
        continue
    fi

    orig_size=$(stat -c%s "$file")

    if [ -n "$QUALITY" ]; then
        cwebp -quiet -q "$QUALITY" "$file" -o "$out" >/dev/null 2>&1
    else
        cwebp -quiet -lossless "$file" -o "$out" >/dev/null 2>&1
    fi

    if [ $? -ne 0 ] || [ ! -f "$out" ]; then
        echo "  [ОШИБКА] $name — cwebp не смог сконвертировать"
        failed=$((failed + 1))
        continue
    fi

    new_size=$(stat -c%s "$out")

    if [ "$new_size" -lt "$orig_size" ]; then
        ratio=$((100 - new_size * 100 / orig_size))
        printf "  %-16s %7d B → %7d B  (-%d%%)\n" "$name" "$orig_size" "$new_size" "$ratio"
    else
        printf "  %-16s %7d B → %7d B  (+%d%%!)\n" "$name" "$orig_size" "$new_size" $((new_size * 100 / orig_size - 100))
    fi

    if [ "$KEEP_PNG" -eq 0 ]; then
        rm -f "$file"
    fi

    ok=$((ok + 1))
done

# --- Размер после ---
size_after=$(du -sb "$DIR" | awk '{print $1}')
human_after=$(du -sh "$DIR" | awk '{print $1}')

echo
echo "Готово."
echo "  Конвертировано: $ok"
echo "  Пропущено:      $skipped"
echo "  Ошибок:         $failed"
echo
echo "Размер до:    $human_before"
echo "Размер после: $human_after"

if [ "$size_after" -lt "$size_before" ]; then
    total_saved=$((size_before - size_after))
    total_ratio=$((100 - size_after * 100 / size_before))
    human_saved=$(numfmt --to=iec --suffix=B "$total_saved" 2>/dev/null || echo "$total_saved B")
    echo "Сэкономлено:  $human_saved (-$total_ratio%)"
fi

if [ -n "$backup_dir" ]; then
    echo
    echo "Откат: rm -rf '$DIR' && mv '$backup_dir' '$DIR'"
fi