#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0

# Vérifier si le script est exécuté en root
check_root() {
    if [[ $EUID -ne 0 ]]; then
       echo "❌ Ce script doit être exécuté en tant que root."
       exit 1
    fi
}

generate_token() {
    tr -dc 'A-Za-z0-9' < /dev/urandom | head -c "${1:-32}"
    echo
}

update_system() {
    echo "=== Mise à jour du système ==="
    
    # Mise à jour des paquets APT
    if command -v apt &> /dev/null; then
        echo "🔄 Mise à jour des paquets APT..."
        sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo apt clean
        if [ $? -ne 0 ]; then
            echo "❌ Erreur lors de la mise à jour des paquets APT." >&2
            exit 1
        else
            echo "✅ Mise à jour terminée."
        fi
    fi
    
    # Mise à jour des paquets Flatpak si Flatpak est installé
    if command -v flatpak &> /dev/null; then
        echo "🔄 Mise à jour des paquets Flatpak..."
        flatpak update -y
        if [ $? -ne 0 ]; then
            echo "❌ Erreur lors de la mise à jour des paquets Flatpak." >&2
            exit 1
        else
            echo "✅ Mise à jour terminée."
        fi
    fi
    
}


# Récupérer le nom d’hôte complet (FQDN) et le domaine
get_fqdn_and_domain() {
    local fqdn domain

    # Récupérer le FQDN en priorité avec hostname -f
    fqdn=$(hostname -f 2>/dev/null) || fqdn=$(cat /etc/hostname 2>/dev/null)

    # Vérifier si la récupération du FQDN a réussi
    if [[ -z "$fqdn" ]]; then
        echo "❌ Erreur : Impossible de déterminer le FQDN" >&2
        return 1
    fi

    # Extraire le domaine
    domain=${fqdn#*.}

    echo "$fqdn" "$domain"
}


# Vérification de la résolution DNS
check_dns() {
    local server_name=$1

    # Récupération de l'adresse IP publique du serveur
    SERVER_IP=$(curl -4 -s ifconfig.me || hostname -I | awk '{print $1}')

    # Récupération de l'adresse IP associée au FQDN
    FQDN_IP=$(dig +short A "$server_name" | tail -n1)

    # Vérification si l'IP du FQDN est récupérable
    if [[ -z "$FQDN_IP" ]]; then
        echo "❌ Erreur : Impossible de récupérer l'adresse IP associée à $server_name via DIG."
        echo "➡️  Vérifie la configuration DNS et l'existence du domaine."
        return 1  # Erreur bloquante uniquement ici
    fi

    # Comparaison des IPs mais uniquement en Alerte non bloquante
    if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
        echo "⚠️  Alerte DNS : L'adresse IP résolue ($FQDN_IP) ne correspond pas à l'IP publique actuelle ($SERVER_IP)."
        echo "➡️  Vérifie la configuration DNS et la propagation si nécessaire."
    else
        echo "✅ Vérification réussie : $server_name pointe correctement vers $SERVER_IP."
    fi

    return 0
}


setup_ssl() {
    local fqdn=$1
    local le_dir="/etc/letsencrypt/live/$fqdn"
    
    echo "=== Configuration du certificat SSL pour $fqdn ==="
    
    if [[ -f "$le_dir/fullchain.pem" ]]; then
        echo "✅ Certificat SSL déjà existant."
        openssl x509 -noout -text -in "$le_dir/fullchain.pem" | grep "Not After"
        return 0
    fi
    
    echo "🔄 Test de génération d’un nouveau certificat SSL via HTTP..."
    
    while true; do
        # Vérification que le dossier webroot existe
        webroot_path="/var/www/cedrix"
        if [[ ! -d "$webroot_path" ]]; then
            echo "❌ Le dossier $webroot_path n'existe pas. Apache n'a pas été installé..."
            exit 1
        fi

        echo "🔍 Test de génération de certificat via webroot ($webroot_path)..."
        
        certbot certonly --webroot -w "$webroot_path" --dry-run -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
        if [[ $? -eq 0 ]]; then
            echo "✅ Test réussi, génération réelle du certificat..."
            certbot certonly --webroot -w "$webroot_path" -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
            break
        else
            echo "⚠️ Échec du test via HTTP. Tentative via DNS..."
            echo "🔄 Test de génération d’un nouveau certificat SSL via challenge DNS..."
            echo "🛠️ Veuillez ajouter un enregistrement TXT pour _acme-challenge.$fqdn avec la valeur fournie par certbot."

            while true; do
                certbot certonly --manual --preferred-challenges dns --dry-run -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
                if [[ $? -eq 0 ]]; then
                    echo "✅ Test DNS réussi. Veuillez maintenant ajouter le bon enregistrement TXT."
                    echo "⏳ Appuyez sur une touche pour continuer après l'ajout de l'enregistrement TXT..."
                    read -n 1 -s  # Attente de l'appui sur une touche

                    # Génération réelle du certificat avec DNS challenge
                    echo "✅ Génération réelle du certificat via challenge DNS..."
                    certbot certonly --manual --preferred-challenges dns -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
                    break 2  # Sort de la boucle interne ET de la boucle externe
                else
                    echo "❌ Échec de la génération du certificat SSL avec toutes les méthodes."
                    read -p "Voulez-vous interrompre le processus ? (o/n) : " choix
                    if [[ "$choix" == "o" ]]; then
                        exit 1
                    fi
                fi
            done
        fi
    done

    
    echo "✅ Certificat SSL généré avec succès."
}




# Fonction pour récupérer et retourner les adresses IP de la machine
get_server_ips() {
    local SERVER_IP SERVER_IPv6

    SERVER_IP=$(curl -4 -s ifconfig.me || hostname -I | awk '{print $1}')
    SERVER_IPv6=$(curl -6 -s ifconfig.me || hostname -I | awk '{print $2}')

    echo "$SERVER_IP" "$SERVER_IPv6"
}
