#!/usr/bin/env bash
# clean-system — безопасная интерактивная очистка системы

set -eo pipefail

_size() {
    local path=$1
    [[ -e "$path" ]] && du -sh "$path" 2>/dev/null | cut -f1 || echo "—"
}

declare -A TASK_CMD TASK_PATH TASK_DESC

_register() {
    local id=$1 desc=$2 path=$3; shift 3
    TASK_DESC[$id]="$desc"
    TASK_PATH[$id]="$path"
    TASK_CMD[$id]="$*"
}

_register pacman-cache \
    "Pacman кеш (оставить 2 версии)" \
    "/var/cache/pacman/pkg" \
    sudo paccache -rk2

_register paru-cache \
    "Paru build кеш" \
    "$HOME/.cache/paru" \
    yes | paru -Sc

_register uv-cache \
    "uv (Python) кеш" \
    "$HOME/.cache/uv" \
    uv cache clean

_register npm-cache \
    "npm кеш" \
    "$HOME/.npm" \
    npm cache clean --force

_register cargo-cache \
    "Cargo registry (скачанные крейты)" \
    "$HOME/.cargo/registry" \
    rm -rf "$HOME/.cargo/registry/cache" "$HOME/.cargo/registry/src"

_register restic-cache \
    "Restic старые кеши" \
    "$HOME/.cache/restic" \
    restic cache --cleanup

_register thumbnails \
    "Кеш миниатюр" \
    "$HOME/.cache/thumbnails" \
    rm -rf "$HOME/.cache/thumbnails"

_register journal \
    "Systemd journal (оставить 2 недели)" \
    "" \
    journalctl --vacuum-time=2weeks

_register pip-cache \
    "pip кеш" \
    "$HOME/.cache/pip" \
    pip3 cache purge

_register zsh-compdump \
    "Zsh completion cache" \
    "" \
    rm -f "$HOME/.config/zsh/.zcompdump"

ORDERED=(pacman-cache paru-cache uv-cache npm-cache cargo-cache
         restic-cache thumbnails journal pip-cache zsh-compdump)

main() {
    if ! command -v fzf &>/dev/null; then
        echo "fzf not found"; exit 1
    fi

    local lines=()
    for id in "${ORDERED[@]}"; do
        local path="${TASK_PATH[$id]:-}"
        local size
        size=$( [[ -n "$path" ]] && _size "$path" || echo "—" )
        lines+=("$(printf "%-14s  %6s   %s" "$id" "$size" "${TASK_DESC[$id]}")")
    done

    local selected
    selected=$(printf '%s\n' "${lines[@]}" | fzf \
        --multi \
        --prompt "clean > " \
        --header "Пробел — выбрать | Enter — запустить | Ctrl-A — выбрать всё" \
        --bind "ctrl-a:select-all" \
        --reverse \
        --height=50%) || exit 0

    [[ -z "$selected" ]] && exit 0

    while IFS= read -r line; do
        local id
        id=$(awk '{print $1}' <<< "$line")

        local path="${TASK_PATH[$id]:-}"
        local before=""
        [[ -n "$path" ]] && before=$(_size "$path")

        echo ""
        echo "▶ ${TASK_DESC[$id]}  ${before:+(было: $before)}"
        eval "${TASK_CMD[$id]}" || true

        if [[ -n "$path" && -n "$before" ]]; then
            local after
            after=$(_size "$path")
            echo "  → стало: $after"
        fi
    done <<< "$selected"

    echo ""
    echo "Готово."
}

main "$@"
