#!/usr/bin/env bash
#
# Сжатие PNG без ресайза.
#
# Использование:
#   ./optimize_png.sh <путь_к_каталогу> [--no-backup]
#
# Пример:
#   /var/www/pw_web_sait/lk/tools/optimize_png.sh \
#       /var/www/pw_web_sait/lk/Frontend/public/class_icons
#
# Что делает:
#   1. Создаёт бэкап каталога рядом: <каталог>_backup_<timestamp>
#   2. Прогоняет каждый *.png через pngquant (quality 70-95) и optipng -o2 -strip all
#   3. Показывает статистику до/после и команду отката
#
# Откат:
#   rm -rf <каталог> && mv <каталог>_backup_<timestamp> <каталог>

set -u

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

for arg in "$@"; do
    case "$arg" in
        --no-backup)
            BACKUP=0
            ;;
        -h|--help)
            grep '^#' "$0" | sed 's/^# \{0,1\}//'
            exit 0
            ;;
        *)
            if [ -z "$DIR" ]; then
                DIR="$arg"
            else
                echo "Ошибка: лишний аргумент: $arg" >&2
                exit 1
            fi
            ;;
    esac
done

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

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

# --- Проверка зависимостей ---
missing=()
command -v pngquant >/dev/null 2>&1 || missing+=("pngquant")
command -v optipng  >/dev/null 2>&1 || missing+=("optipng")

if [ ${#missing[@]} -gt 0 ]; then
    echo "Не установлены утилиты: ${missing[*]}" >&2
    echo "Установка:" >&2
    echo "  apt install -y ${missing[*]}" >&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

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

echo "Обработка $total файлов в: $DIR"
echo

for file in "${files[@]}"; do
    name=$(basename "$file")
    orig_size=$(stat -c%s "$file")

    # Шаг 1: pngquant
    pngquant --quality=70-95 --ext .png --force "$file" >/dev/null 2>&1
    code=$?

    if [ $code -ne 0 ] && [ $code -ne 99 ]; then
        echo "  [ОШИБКА] $name — pngquant вернул код $code"
        failed=$((failed + 1))
        continue
    fi

    # Шаг 2: optipng
    optipng -o2 -strip all -quiet "$file" >/dev/null 2>&1
    code=$?

    if [ $code -ne 0 ]; then
        echo "  [ОШИБКА] $name — optipng вернул код $code"
        failed=$((failed + 1))
        continue
    fi

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

    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"
        ok=$((ok + 1))
    else
        printf "  %-16s %7d B (без изменений)\n" "$name" "$orig_size"
        skipped=$((skipped + 1))
    fi
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