#!/bin/bash
###############################################################################
# NG-Info - Proxmox Tiny Deploy
# Script principal d'orchestration
#
# Source  : https://files.ng-info.com/proxmox/setup.sh
# Usage   : bash <(curl -s https://files.ng-info.com/proxmox/setup.sh)
#
# Déploie sur un Proxmox VE 8/9 fresh :
#   - Configuration PVE (no-subscription, mises à jour)
#   - CT 101 : Netbird
#   - VM 100 : Linux Mint
#   - CT 102 : Dockhand
#   - VM 103 : NodeZero
###############################################################################

set -euo pipefail

# ============================================================================
# CONFIGURATION GLOBALE
# ============================================================================
readonly BASE_URL="https://files.ng-info.com/proxmox"
readonly SCRIPT_VERSION="1.7.0"
readonly LOG_FILE="/var/log/ng-deploy-$(date +%Y%m%d-%H%M%S).log"

# IDs des CT/VM
readonly CT_NETBIRD_ID=101
readonly CT_DOCKHAND_ID=102
readonly VM_MINT_ID=100
readonly VM_NODEZERO_ID=103

# Specs ressources
readonly CT_NETBIRD_RAM=512
readonly CT_NETBIRD_DISK=4
readonly CT_NETBIRD_CORES=1

readonly CT_DOCKHAND_RAM=1024
readonly CT_DOCKHAND_DISK=8
readonly CT_DOCKHAND_CORES=2

readonly VM_NODEZERO_RAM=4096
readonly VM_NODEZERO_CORES=2

# Stockage
readonly STORAGE="local-lvm"
readonly TEMPLATE_STORAGE="local"

# Default Netbird management URL
readonly DEFAULT_NB_MGMT_URL="https://netbird.ng-info.com"

# Derniers octets par défaut (modifiables au runtime)
readonly DEFAULT_PVE_OCTET=10
readonly DEFAULT_NETBIRD_OCTET=11
readonly DEFAULT_MINT_OCTET=12
readonly DEFAULT_DOCKHAND_OCTET=13
readonly DEFAULT_NODEZERO_OCTET=14
readonly DEFAULT_GATEWAY_OCTET=1

# ============================================================================
# COULEURS ET LOGGING
# ============================================================================
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} $*" | tee -a "$LOG_FILE"; }
ok()     { echo -e "${GREEN}[OK]${NC} $*" | tee -a "$LOG_FILE"; }
warn()   { echo -e "${YELLOW}[WARN]${NC} $*" | tee -a "$LOG_FILE"; }
err()    { echo -e "${RED}[ERROR]${NC} $*" | tee -a "$LOG_FILE"; }
fatal()  { err "$*"; exit 1; }

# ============================================================================
# VÉRIFICATIONS PRÉALABLES
# ============================================================================
check_prerequisites() {
    log "Vérification des prérequis..."

    [[ $EUID -eq 0 ]] || fatal "Ce script doit être exécuté en root."
    command -v pveversion >/dev/null 2>&1 || fatal "Proxmox VE non détecté."

    local pve_ver
    pve_ver=$(pveversion | head -1)
    ok "Proxmox détecté : $pve_ver"

    # Connectivité internet
    if ! ping -c1 -W2 8.8.8.8 >/dev/null 2>&1; then
        fatal "Pas de connectivité internet (ping 8.8.8.8 échec)."
    fi
    ok "Connectivité internet OK"

    # Vérif que les IDs ne sont pas déjà utilisés
    for id in $VM_MINT_ID $CT_NETBIRD_ID $CT_DOCKHAND_ID $VM_NODEZERO_ID; do
        if qm status "$id" >/dev/null 2>&1 || pct status "$id" >/dev/null 2>&1; then
            fatal "L'ID $id est déjà utilisé sur ce PVE. Le déploiement est destiné à un PVE fresh."
        fi
    done
    ok "IDs $VM_MINT_ID, $CT_NETBIRD_ID, $CT_DOCKHAND_ID, $VM_NODEZERO_ID disponibles"
}

# ============================================================================
# COLLECTE DES PARAMÈTRES CLIENT
# ============================================================================
collect_parameters() {
    echo
    echo "============================================================"
    echo "  NG-INFO - PROXMOX TINY DEPLOY v${SCRIPT_VERSION}"
    echo "============================================================"
    echo

    read -rp "Nom du client                       : " CLIENT_NAME
    read -rp "Nom du site/succursale              : " SITE_NAME
    read -rp "Préfixe réseau (ex: 192.168.50)     : " NET_PREFIX

    if ! [[ "$NET_PREFIX" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        fatal "Préfixe réseau invalide. Format attendu : X.X.X (ex: 192.168.50)"
    fi

    echo
    echo "--- Dernier octet IP (Enter pour valeur par défaut) ---"
    read -rp "Gateway       [${DEFAULT_GATEWAY_OCTET}]   : " GATEWAY_OCTET
    read -rp "PVE           [${DEFAULT_PVE_OCTET}]  : " PVE_OCTET
    read -rp "CT Netbird    [${DEFAULT_NETBIRD_OCTET}]  : " NETBIRD_OCTET
    read -rp "VM Mint       [${DEFAULT_MINT_OCTET}]  : " MINT_OCTET
    read -rp "CT Dockhand   [${DEFAULT_DOCKHAND_OCTET}]  : " DOCKHAND_OCTET
    read -rp "VM NodeZero   [${DEFAULT_NODEZERO_OCTET}]  : " NODEZERO_OCTET

    # Validation des octets (1-254)
    for octet_var in GATEWAY_OCTET PVE_OCTET NETBIRD_OCTET MINT_OCTET DOCKHAND_OCTET NODEZERO_OCTET; do
        local val="${!octet_var:-}"
        if [[ -n "$val" ]] && ! [[ "$val" =~ ^[0-9]+$ && "$val" -ge 1 && "$val" -le 254 ]]; then
            fatal "Octet invalide pour ${octet_var}: '$val' (doit être 1-254)"
        fi
    done

    GATEWAY="${NET_PREFIX}.${GATEWAY_OCTET:-$DEFAULT_GATEWAY_OCTET}"
    PVE_IP="${NET_PREFIX}.${PVE_OCTET:-$DEFAULT_PVE_OCTET}"
    NETBIRD_IP="${NET_PREFIX}.${NETBIRD_OCTET:-$DEFAULT_NETBIRD_OCTET}"
    MINT_IP="${NET_PREFIX}.${MINT_OCTET:-$DEFAULT_MINT_OCTET}"
    DOCKHAND_IP="${NET_PREFIX}.${DOCKHAND_OCTET:-$DEFAULT_DOCKHAND_OCTET}"
    NODEZERO_IP="${NET_PREFIX}.${NODEZERO_OCTET:-$DEFAULT_NODEZERO_OCTET}"

    echo
    read -rp "URL management Netbird [${DEFAULT_NB_MGMT_URL}] : " NB_MGMT_URL
    NB_MGMT_URL="${NB_MGMT_URL:-$DEFAULT_NB_MGMT_URL}"
    read -rsp "Setup key Netbird                  : " NB_SETUP_KEY
    echo

    # Validation format UUID (8-4-4-4-12 hex chars)
    if ! [[ "$NB_SETUP_KEY" =~ ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ ]]; then
        fatal "Setup key Netbird invalide. Format attendu : UUID (ex: 12345678-1234-1234-1234-123456789012)"
    fi

    echo
    echo "--- Mots de passe ---"
    echo "Le password root sera utilisé pour les CT (Netbird, Dockhand) - usage admin."
    echo "Le password ngadmin sera utilisé pour la VM Mint - usage technicien quotidien."
    echo
    read -rsp "Mot de passe ROOT (CT Netbird/Dockhand)  : " ROOT_PASS
    echo
    read -rsp "Confirmer mot de passe ROOT              : " ROOT_PASS_CONFIRM
    echo
    [[ "$ROOT_PASS" == "$ROOT_PASS_CONFIRM" ]] || fatal "Mots de passe root différents."
    [[ ${#ROOT_PASS} -ge 8 ]] || fatal "Mot de passe root trop court (min 8 caractères)."

    read -rsp "Mot de passe NGADMIN (VM Mint)           : " NGADMIN_PASS
    echo
    read -rsp "Confirmer mot de passe NGADMIN           : " NGADMIN_PASS_CONFIRM
    echo
    [[ "$NGADMIN_PASS" == "$NGADMIN_PASS_CONFIRM" ]] || fatal "Mots de passe ngadmin différents."
    [[ ${#NGADMIN_PASS} -ge 8 ]] || fatal "Mot de passe ngadmin trop court (min 8 caractères)."

    # Récap
    echo
    echo "============================================================"
    echo "  RÉCAPITULATIF DU DÉPLOIEMENT"
    echo "============================================================"
    echo "  Client       : $CLIENT_NAME"
    echo "  Site         : $SITE_NAME"
    echo "  Réseau       : ${NET_PREFIX}.0/24"
    echo "  Gateway      : $GATEWAY"
    echo "  PVE          : $PVE_IP"
    echo "  CT Netbird   : $NETBIRD_IP   (ID $CT_NETBIRD_ID)"
    echo "  VM Mint      : $MINT_IP      (ID $VM_MINT_ID)"
    echo "  CT Dockhand  : $DOCKHAND_IP  (ID $CT_DOCKHAND_ID)"
    echo "  VM NodeZero  : $NODEZERO_IP  (ID $VM_NODEZERO_ID)"
    echo "  Netbird URL  : $NB_MGMT_URL"
    echo "============================================================"
    echo
    read -rp "Confirmer le déploiement ? (yes/no) : " CONFIRM
    [[ "$CONFIRM" == "yes" ]] || fatal "Déploiement annulé par l'utilisateur."

    # Export pour les modules
    export CLIENT_NAME SITE_NAME NET_PREFIX GATEWAY
    export PVE_IP NETBIRD_IP MINT_IP DOCKHAND_IP NODEZERO_IP
    export NB_MGMT_URL NB_SETUP_KEY ROOT_PASS NGADMIN_PASS
    export CT_NETBIRD_ID CT_DOCKHAND_ID VM_MINT_ID VM_NODEZERO_ID
    export CT_NETBIRD_RAM CT_NETBIRD_DISK CT_NETBIRD_CORES
    export CT_DOCKHAND_RAM CT_DOCKHAND_DISK CT_DOCKHAND_CORES
    export VM_NODEZERO_RAM VM_NODEZERO_CORES
    export STORAGE TEMPLATE_STORAGE BASE_URL LOG_FILE
}

# ============================================================================
# EXÉCUTION D'UN MODULE
# ============================================================================
run_module() {
    local module_name="$1"
    local module_url="${BASE_URL}/lib/${module_name}.sh"
    local module_path="/tmp/ng-${module_name}.sh"

    echo
    log "============================================================"
    log "  Module : ${module_name}"
    log "============================================================"

    if ! wget -q "$module_url" -O "$module_path"; then
        fatal "Impossible de télécharger le module : $module_url"
    fi

    chmod +x "$module_path"

    if ! bash "$module_path"; then
        fatal "Échec du module : ${module_name}"
    fi

    ok "Module ${module_name} terminé"
}

# ============================================================================
# PIPELINE PRINCIPAL
# ============================================================================
main() {
    log "=== Démarrage du déploiement (log: $LOG_FILE) ==="

    check_prerequisites
    collect_parameters

    run_module "01-pve-config"
    run_module "02-netbird-ct"
    run_module "03-dockhand-ct"
    run_module "04-mint-vm"
    run_module "04b-nodezero-vm"
    run_module "05-finalize"

    echo
    echo "============================================================"
    ok "  DÉPLOIEMENT TERMINÉ AVEC SUCCÈS"
    echo "============================================================"
    echo
    echo "  Client : $CLIENT_NAME - Site : $SITE_NAME"
    echo
    echo "  Accès aux ressources :"
    echo "    - Proxmox   : https://${PVE_IP}:8006"
    echo "    - Netbird   : pct enter ${CT_NETBIRD_ID}  (puis netbird status)"
    echo "    - Dockhand  : http://${DOCKHAND_IP}:3000"
    echo "    - Mint VM   : RDP/ScreenConnect sur ${MINT_IP}"
    echo "    - NodeZero  : Console PVE → VM ${VM_NODEZERO_ID} (config initiale)"
    echo
    echo "  Log complet  : $LOG_FILE"
    echo
    echo "  Prochaines étapes manuelles :"
    echo "    1. Vérifier dans Netbird dashboard que le peer ${CLIENT_NAME}-${SITE_NAME} est connecté"
    echo "    2. VM Mint via xrdp/Netbird : config ScreenConnect (bon group client)"
    echo "    3. Console NodeZero (VM ${VM_NODEZERO_ID}) :"
    echo "       - Login : nodezero / nodezero (force changement de password)"
    echo "       - Région Horizon3 + token d'enrollment"
    echo "    4. Backup PVE initial : vzdump --all"
    echo "    5. Préparer la boîte d'envoi vers le client"
    echo
    echo "============================================================"
}

main "$@"