#!/usr/bin/env bash
# backup/prune -- delete old backup sets, showing exactly what will go
set -o pipefail
SELF=$(readlink -f "${BASH_SOURCE[0]}")
NV_BASE=$(cd "$(dirname "$SELF")/../../.." && pwd)
export NV_BASE
# shellcheck source=/dev/null
. "$NV_BASE/lib/core/bootstrap.sh"

nv_require_root || exit 1
ui_header "$(t backup_m_prune)"

if [ ! -d "$NV_BACKUP_ROOT" ]; then ui_info "$(t backup_none)"; exit 0; fi

keep_default=$(nv_conf backup_keep_days 14)
ui_kv "$(t backup_keep_days)" "$keep_default"
ui_kv "$(t backup_total)" "$(du -sh "$NV_BACKUP_ROOT" 2>/dev/null | cut -f1)"
ui_blank

printf '  %s [%s]: ' "$(t backup_prune_prompt)" "$keep_default"
read -r days || exit 130
days=$(nv_trim "$days"); [ -z "$days" ] && days=$keep_default
case $days in ''|*[!0-9]*) ui_err "$(t ui_invalid_number)"; exit 2 ;; esac
[ "$days" -lt 1 ] && { ui_err "$(t backup_prune_min)"; exit 2; }

mapfile -t victims < <(find "$NV_BACKUP_ROOT" -mindepth 1 -maxdepth 1 -type d \
                       -mtime "+$days" -printf '%f\n' 2>/dev/null | sort)

if [ ${#victims[@]} -eq 0 ]; then
    ui_ok "$(t backup_prune_nothing "$days")"
    exit 0
fi

ui_section "$(t backup_prune_will_delete "${#victims[@]}")"
for v in "${victims[@]}"; do
    printf '  %-40s %s\n' "$v" "$(du -sh "$NV_BACKUP_ROOT/$v" 2>/dev/null | cut -f1)"
done

size=$(du -sc "${victims[@]/#/$NV_BACKUP_ROOT/}" 2>/dev/null | tail -n 1 | cut -f1)
ui_blank
ui_warn "$(t backup_prune_freed "$((size / 1024))")"
ui_confirm "$(t backup_prune_confirm)" n || { ui_info "$(t pf_cancelled)"; exit 0; }

count=0
for v in "${victims[@]}"; do
    rm -rf "${NV_BACKUP_ROOT:?}/$v" && count=$((count + 1))
done
nv_trace backup-prune "removed $count set(s) older than ${days}d"
ui_ok "$(t backup_prune_done "$count")"
exit 0
