#!/bin/bash
###############################################################################
# Module 04b - VM NodeZero
# - Télécharge le vzdump du template NodeZero (appliance Horizon3)
# - Restaure la VM avec l'ID 103
# - Fix : déconvertit le template + rename LV base- → vm- + active + writable
# - Configure cloud-init avec l'IP statique
# - Démarre la VM
#
# Note : NodeZero est une appliance Horizon3 (Ubuntu 24.04). Cloud-init est
# présent par défaut et applique l'IP. La région et l'enrollment se font
# manuellement dans la console au premier boot.
###############################################################################

set -euo pipefail

log() { echo -e "\033[0;34m[$(date +%H:%M:%S)]\033[0m $*"; }
ok()  { echo -e "\033[0;32m[OK]\033[0m $*"; }
err() { echo -e "\033[0;31m[ERROR]\033[0m $*"; }
warn(){ echo -e "\033[1;33m[WARN]\033[0m $*"; }

VM_ID="${VM_NODEZERO_ID}"
VM_NAME="nodezero-${CLIENT_NAME,,}-${SITE_NAME,,}"
VM_NAME=$(echo "$VM_NAME" | tr -cs 'a-z0-9-' '-' | sed 's/^-//;s/-$//')

TEMPLATE_URL="${BASE_URL}/templates/nodezero-v1.vma.zst"
TEMPLATE_LOCAL="/var/lib/vz/dump/vzdump-qemu-${VM_ID}-nodezero-v1.vma.zst"

# ----------------------------------------------------------------------------
# Téléchargement du template
# ----------------------------------------------------------------------------
log "Téléchargement du template NodeZero..."
log "URL : ${TEMPLATE_URL}"

mkdir -p /var/lib/vz/dump

if ! wget --progress=dot:giga -O "$TEMPLATE_LOCAL" "$TEMPLATE_URL"; then
    err "Échec du téléchargement du template NodeZero"
    exit 1
fi

TEMPLATE_SIZE=$(du -h "$TEMPLATE_LOCAL" | cut -f1)
ok "Template téléchargé (${TEMPLATE_SIZE})"

# ----------------------------------------------------------------------------
# Restauration de la VM
# ----------------------------------------------------------------------------
log "Restauration de la VM ${VM_ID} depuis le template NodeZero..."

qmrestore "$TEMPLATE_LOCAL" "$VM_ID" --storage "$STORAGE" --unique 1

ok "VM ${VM_ID} restaurée"

# ----------------------------------------------------------------------------
# Fix : qmrestore d'un template recrée la VM en mode template avec disque
# read-only et LV non-actif. On rectifie tout.
# ----------------------------------------------------------------------------
log "Conversion du template restauré en VM utilisable..."

qm set "$VM_ID" --template 0 >/dev/null 2>&1 || true

if lvs "pve/base-${VM_ID}-disk-0" >/dev/null 2>&1; then
    log "  Renommage du LV base-${VM_ID}-disk-0 → vm-${VM_ID}-disk-0..."
    lvrename "pve/base-${VM_ID}-disk-0" "vm-${VM_ID}-disk-0"

    log "  Activation du LV (thin pristine)..."
    lvchange -ay "pve/vm-${VM_ID}-disk-0"

    log "  Marquage du LV en writable..."
    lvchange -p rw "pve/vm-${VM_ID}-disk-0"

    log "  Mise à jour de la config VM..."
    sed -i "s/base-${VM_ID}-disk-/vm-${VM_ID}-disk-/g" "/etc/pve/qemu-server/${VM_ID}.conf"

    ok "Disque converti : base- → vm- (actif, writable)"
else
    warn "  LV base-${VM_ID}-disk-0 introuvable, on continue (peut-être déjà en vm-)"
fi

# ----------------------------------------------------------------------------
# Configuration de la VM
# ----------------------------------------------------------------------------
log "Configuration de la VM..."

qm set "$VM_ID" --name "$VM_NAME" >/dev/null
qm set "$VM_ID" --description "NodeZero appliance - ${CLIENT_NAME} / ${SITE_NAME}" >/dev/null
qm set "$VM_ID" --memory "$VM_NODEZERO_RAM" >/dev/null
qm set "$VM_ID" --cores "$VM_NODEZERO_CORES" >/dev/null
qm set "$VM_ID" --onboot 1 >/dev/null

# Configuration cloud-init pour l'IP statique
log "Configuration cloud-init avec l'IP ${NODEZERO_IP}..."

if ! qm config "$VM_ID" | grep -q "ide2.*cloudinit"; then
    qm set "$VM_ID" --ide2 "${STORAGE}:cloudinit" >/dev/null
fi

qm set "$VM_ID" --ipconfig0 "ip=${NODEZERO_IP}/24,gw=${GATEWAY}" >/dev/null
qm set "$VM_ID" --nameserver "1.1.1.1 8.8.8.8" >/dev/null
# Note : ciuser/cipassword non configurés car NodeZero force le changement
# de password au premier login (nodezero/nodezero par défaut)

ok "Cloud-init configuré (IP ${NODEZERO_IP})"

# ----------------------------------------------------------------------------
# Démarrage de la VM
# ----------------------------------------------------------------------------
log "Démarrage de la VM ${VM_ID}..."
qm start "$VM_ID"

log "Attente du démarrage de NodeZero (peut prendre 2-3 min)..."

for i in {1..90}; do
    if ping -c1 -W2 "$NODEZERO_IP" >/dev/null 2>&1; then
        ok "VM NodeZero démarrée et répond au ping sur ${NODEZERO_IP}"
        break
    fi
    if [[ $i -eq 90 ]]; then
        warn "NodeZero ne répond pas au ping après 3 min"
        warn "La VM démarre peut-être encore. Vérifie via la console noVNC."
        break
    fi
    sleep 2
done

# ----------------------------------------------------------------------------
# Récap
# ----------------------------------------------------------------------------
echo
ok "VM NodeZero déployée : ${VM_NAME} (ID ${VM_ID}, IP ${NODEZERO_IP})"
echo
echo "============================================================"
echo "  ÉTAPES MANUELLES POST-DÉPLOIEMENT NODEZERO"
echo "============================================================"
echo ""
echo "  1. Console : Proxmox UI → VM ${VM_ID} → Console"
echo ""
echo "  2. Login initial : nodezero / nodezero"
echo "     → Change le password (forcé)"
echo "     → STOCKER LE PASSWORD DANS HUDU"
echo ""
echo "  3. Sélectionner la région NodeZero (Standard US / GDPR EU / FED-FH)"
echo ""
echo "  4. Compléter l'enrollment avec le token client (portail Horizon3)"
echo ""
echo "============================================================"

ok "Module 04b (VM NodeZero) terminé"