#!/bin/bash
###############################################################################
# NG-Info - Proxmox Tiny Cleanup
# Supprime les CT/VM créés par setup.sh et nettoie les artefacts
#
# Source : https://files.ng-info.com/proxmox/cleanup.sh
# Usage  : bash <(curl -s https://files.ng-info.com/proxmox/cleanup.sh)
#
# Préserve :
#   - Les templates locaux (VM 9000 mint-template, etc.)
#   - La config PVE de base
###############################################################################

set -uo pipefail

readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly NC='\033[0m'

log()  { echo -e "${BLUE}[$(date +%H:%M:%S)]${NC} $*"; }
ok()   { echo -e "${GREEN}[OK]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
err()  { echo -e "${RED}[ERROR]${NC} $*"; }

# IDs à nettoyer (correspondent à setup.sh)
readonly VM_MINT_ID=100
readonly CT_NETBIRD_ID=101
readonly CT_DOCKHAND_ID=102
readonly VM_NODEZERO_ID=103

[[ $EUID -eq 0 ]] || { err "Doit être exécuté en root"; exit 1; }
command -v pveversion >/dev/null 2>&1 || { err "Proxmox VE non détecté"; exit 1; }

echo
echo "============================================================"
echo "  NG-INFO - PROXMOX CLEANUP"
echo "============================================================"
echo
echo "Ce script va SUPPRIMER :"
echo "  - VM ${VM_MINT_ID}  (Mint)"
echo "  - CT ${CT_NETBIRD_ID}  (Netbird)"
echo "  - CT ${CT_DOCKHAND_ID}  (Dockhand)"
echo "  - VM ${VM_NODEZERO_ID}  (NodeZero)"
echo "  - Tous les LV résiduels associés"
echo "  - Les fichiers vzdump locaux (mint-*, nodezero-*)"
echo "  - Les logs de déploiement /var/log/ng-deploy-*"
echo
echo "PRÉSERVÉ :"
echo "  - Templates locaux (VM 9000+ et CT 9000+)"
echo "  - Config réseau PVE"
echo "  - Tout autre CT/VM"
echo
read -rp "Confirmer le cleanup ? (yes/no) : " CONFIRM
[[ "$CONFIRM" == "yes" ]] || { warn "Cleanup annulé"; exit 0; }

# ============================================================================
# Fonction : détruire une VM (avec force/unlock si bloquée)
# ============================================================================
destroy_vm() {
    local vmid="$1"
    local label="$2"

    if ! qm status "$vmid" >/dev/null 2>&1; then
        log "VM ${vmid} (${label}) : n'existe pas, skip"
        return
    fi

    log "VM ${vmid} (${label}) : suppression..."

    qm unlock "$vmid" 2>/dev/null || true
    qm stop "$vmid" --skiplock 2>/dev/null || true
    sleep 1
    qm destroy "$vmid" --skiplock --purge 2>/dev/null || {
        warn "  qm destroy a échoué, tentative manuelle..."
        rm -f "/etc/pve/qemu-server/${vmid}.conf"
    }

    ok "VM ${vmid} supprimée"
}

# ============================================================================
# Fonction : détruire un CT
# ============================================================================
destroy_ct() {
    local ctid="$1"
    local label="$2"

    if ! pct status "$ctid" >/dev/null 2>&1; then
        log "CT ${ctid} (${label}) : n'existe pas, skip"
        return
    fi

    log "CT ${ctid} (${label}) : suppression..."

    pct unlock "$ctid" 2>/dev/null || true
    pct stop "$ctid" --skiplock 2>/dev/null || true
    sleep 1
    pct destroy "$ctid" --purge --force 2>/dev/null || {
        warn "  pct destroy a échoué, tentative manuelle..."
        rm -f "/etc/pve/lxc/${ctid}.conf"
    }

    ok "CT ${ctid} supprimé"
}

# ============================================================================
# Fonction : nettoyer les LV résiduels pour un ID donné
# ============================================================================
cleanup_lvs() {
    local id="$1"
    local found=0

    for lv_name in "base-${id}-disk-0" "vm-${id}-disk-0" "vm-${id}-disk-1" "vm-${id}-cloudinit"; do
        if lvs "pve/${lv_name}" >/dev/null 2>&1; then
            log "  Suppression LV : ${lv_name}"
            lvchange -an "pve/${lv_name}" 2>/dev/null || true
            lvremove -f "pve/${lv_name}" 2>/dev/null || warn "    Échec suppression ${lv_name}"
            found=1
        fi
    done

    if [[ $found -eq 1 ]]; then
        ok "  LV résiduels nettoyés pour ID ${id}"
    fi
}

# ============================================================================
# Suppressions
# ============================================================================
echo
log "=== Suppression des CT/VM ==="
destroy_vm "$VM_MINT_ID"      "Mint"
destroy_ct "$CT_NETBIRD_ID"   "Netbird"
destroy_ct "$CT_DOCKHAND_ID"  "Dockhand"
destroy_vm "$VM_NODEZERO_ID"  "NodeZero"

echo
log "=== Nettoyage des LV résiduels ==="
for id in $VM_MINT_ID $CT_NETBIRD_ID $CT_DOCKHAND_ID $VM_NODEZERO_ID; do
    cleanup_lvs "$id"
done

# ============================================================================
# Nettoyage des fichiers vzdump téléchargés
# ============================================================================
echo
log "=== Nettoyage des vzdump locaux ==="
DUMP_FILES=$(ls /var/lib/vz/dump/vzdump-qemu-*-mint-*.vma.zst \
                /var/lib/vz/dump/vzdump-qemu-*-nodezero-*.vma.zst \
                2>/dev/null || true)

if [[ -n "$DUMP_FILES" ]]; then
    echo "$DUMP_FILES" | while read -r f; do
        log "  Suppression : $f"
        rm -f "$f"
    done
    ok "Fichiers vzdump supprimés"
else
    log "Aucun fichier vzdump à supprimer"
fi

# ============================================================================
# Nettoyage des logs et fichiers temporaires
# ============================================================================
echo
log "=== Nettoyage des logs et tmp ==="
rm -f /tmp/ng-*.sh
rm -f /tmp/ng-debian-template /tmp/ng-debian-template-path
LOG_COUNT=$(ls /var/log/ng-deploy-*.log 2>/dev/null | wc -l)
if [[ $LOG_COUNT -gt 0 ]]; then
    rm -f /var/log/ng-deploy-*.log
    ok "${LOG_COUNT} log(s) de déploiement supprimé(s)"
fi

# ============================================================================
# Récap final
# ============================================================================
echo
echo "============================================================"
ok "  CLEANUP TERMINÉ"
echo "============================================================"
echo
echo "État actuel du PVE :"
echo
echo "VMs restantes :"
qm list 2>/dev/null || echo "  (aucune)"
echo
echo "CTs restants :"
pct list 2>/dev/null || echo "  (aucun)"
echo
echo "LV qui pourraient rester :"
lvs 2>/dev/null | grep -E "(base|vm)-(100|101|102|103)" || echo "  (aucun résiduel sur les IDs 100-103)"
echo
echo "============================================================"
echo "Prêt pour un nouveau déploiement :"
echo "  bash <(curl -s https://files.ng-info.com/proxmox/setup.sh)"
echo "============================================================"