#!/bin/bash
set -euo pipefail

##############################
# Сколько дней считать старым
MAX_AGE_DAYS=0
##############################

SSTREAMS_DIR="/srv/sstreams"
DRY_RUN=false

for arg in "$@"; do
    case "$arg" in
        --dry-run) DRY_RUN=true ;;
        --help|-h)
            echo "Очистка старых образов из incus simplestreams архива"
            echo ""
            echo "Использование: $0 [--dry-run]"
            echo ""
            echo "  --dry-run   Показать что будет удалено, без реального удаления"
            echo ""
            echo "Настройка: переменная MAX_AGE_DAYS в начале скрипта (сейчас: ${MAX_AGE_DAYS})"
            exit 0
            ;;
        *)
            echo "Неизвестный аргумент: $arg"
            echo "Используйте --help для справки"
            exit 1
            ;;
    esac
done

cd "$SSTREAMS_DIR"

if [[ ! -f "streams/v1/images.json" ]]; then
    echo "Ошибка: не найден streams/v1/images.json в $SSTREAMS_DIR"
    exit 1
fi

CUTOFF=$(date -d "-${MAX_AGE_DAYS} days" +%s)
CUTOFF_HUMAN=$(date -d "-${MAX_AGE_DAYS} days" +%Y-%m-%d)

echo "Порог: образы старше ${MAX_AGE_DAYS} дней (до ${CUTOFF_HUMAN})"
if $DRY_RUN; then
    echo "=== ПРОБНЫЙ ЗАПУСК (без удаления) ==="
fi
echo ""

# Собираем список старых образов из incus-simplestreams list
# CSV: fingerprint,description,os,release,variant,arch,type,created
REMOVED=0
TOTAL=0

while IFS=, read -r fingerprint description os release variant arch type created; do
    TOTAL=$((TOTAL + 1))
    # created = "2026/02/14 00:00 UTC"
    img_ts=$(date -d "$created" +%s 2>/dev/null || continue)
    if [[ $img_ts -ge $CUTOFF ]]; then
        continue
    fi

    if $DRY_RUN; then
        echo "[dry-run] $fingerprint  $description"
    else
        echo "Удаляю: $fingerprint  $description"
        incus-simplestreams remove "$fingerprint" 2>&1 || echo "  Ошибка при удалении из индекса"
    fi
    REMOVED=$((REMOVED + 1))
done < <(incus-simplestreams list -f csv)

echo ""
echo "=== Итого ==="
echo "Всего образов: ${TOTAL}"
echo "Удалено: ${REMOVED}"
echo "Осталось: $((TOTAL - REMOVED))"

# Очистка осиротевших файлов в images/
echo ""
echo "Проверка осиротевших файлов..."

ORPHAN_COUNT=0
ORPHAN_SIZE=0

# Собираем все пути, на которые ссылается индекс
mapfile -t REFERENCED < <(python3 -c "
import json, os
with open('streams/v1/images.json') as f:
    data = json.load(f)
for product in data['products'].values():
    for version in product.get('versions', {}).values():
        for item in version.get('items', {}).values():
            path = item.get('path', '')
            if path:
                print(os.path.basename(path))
")

declare -A REF_MAP
for f in "${REFERENCED[@]}"; do
    REF_MAP["$f"]=1
done

for filepath in images/*; do
    [[ -f "$filepath" ]] || continue
    fname=$(basename "$filepath")
    if [[ -z "${REF_MAP[$fname]:-}" ]]; then
        size=$(stat -c%s "$filepath" 2>/dev/null || echo 0)
        ORPHAN_SIZE=$((ORPHAN_SIZE + size))
        ORPHAN_COUNT=$((ORPHAN_COUNT + 1))
        if $DRY_RUN; then
            echo "  [dry-run] сирота: ${filepath} ($(numfmt --to=iec "$size"))"
        else
            rm -f "$filepath"
            echo "  удалён сирота: ${filepath} ($(numfmt --to=iec "$size"))"
        fi
    fi
done

if [[ $ORPHAN_COUNT -gt 0 ]]; then
    echo "Осиротевших файлов: ${ORPHAN_COUNT} ($(numfmt --to=iec ${ORPHAN_SIZE}))"
else
    echo "Осиротевших файлов не найдено"
fi
