#!/bin/bash

# Importer les fonctions communes
source "$(dirname "$0")/../common/common_utils.sh"

# Vérifier si le script est exécuté en root
check_root

# Installer dnsmasq s'il n'est pas déjà installé
if ! command -v dnsmasq &> /dev/null; then
    echo "Installation de dnsmasq..."
    apt update && apt install -y dnsmasq
else
    echo "dnsmasq est déjà installé."
fi


# Obtenir l'adresse IP du serveur sur l'interface principale
IP_SERVEUR=$(ip -4 addr show $(ip route show default | awk '/default/ {print $5}') | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
if [[ -z "$IP_SERVEUR" ]]; then
    echo "Impossible de déterminer l'adresse IP du serveur."
    exit 1
fi

# Vérifier si l'IP est dans une plage privée autorisée
if [[ "$IP_SERVEUR" =~ ^10\..* || "$IP_SERVEUR" =~ ^192\.168\..* || "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\..* ]]; then
    echo "Adresse IP privée détectée : $IP_SERVEUR"
else
    echo "Erreur : L'adresse IP $IP_SERVEUR n'est pas dans un réseau privé."
    exit 1
fi

FORCE=false
if [[ "$1" == "--force" ]]; then
    FORCE=true
    echo "Mode forçage activé : reconfiguration complète..."
fi

if systemctl is-active --quiet dnsmasq && [ "$FORCE" = false ]; then
    echo "dnsmasq est déjà actif et configuré. Utilisez --force pour reconfigurer."
    exit 0
fi

# Déduire le sous-réseau et proposer des domaines en fonction du réseau détecté
if [[ "$IP_SERVEUR" =~ ^10\. ]]; then
    SOUS_RESEAU=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1".0.0.0/8"}')
    DHCP_START=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1".0.0.10"}')
    DHCP_END=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1".0.0.100"}')
    DOMAIN_SUGGESTIONS=("lan10.local" "private10.local" "intranet10.local")
elif [[ "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]; then
    SOUS_RESEAU=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2".0.0/16"}')
    DHCP_START=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2".0.10"}')
    DHCP_END=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2".0.100"}')
    DOMAIN_SUGGESTIONS=("lan172.local" "private172.local" "intranet172.local")
elif [[ "$IP_SERVEUR" =~ ^192\.168\. ]]; then
    SOUS_RESEAU=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2"."$3".0/24"}')
    DHCP_START=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2"."$3".10"}')
    DHCP_END=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2"."$3".100"}')
    DOMAIN_SUGGESTIONS=("home.local" "office.local" "lan.local")
fi

# Afficher les suggestions de domaine et demander à l'utilisateur de choisir
echo "Propositions de domaine :"
for i in "${!DOMAIN_SUGGESTIONS[@]}"; do
    echo "[$((i+1))] ${DOMAIN_SUGGESTIONS[$i]}"
done
echo "[0] Saisir un autre domaine"

read -p "Choisissez un domaine (1-${#DOMAIN_SUGGESTIONS[@]}) ou 0 pour entrer le vôtre : " CHOIX_DOMAINE

if [[ "$CHOIX_DOMAINE" =~ ^[1-9]+$ ]] && ((CHOIX_DOMAINE >= 1 && CHOIX_DOMAINE <= ${#DOMAIN_SUGGESTIONS[@]})); then
    DOMAINE=${DOMAIN_SUGGESTIONS[$((CHOIX_DOMAINE-1))]}
elif [[ "$CHOIX_DOMAINE" == "0" ]]; then
    read -p "Entrez votre domaine personnalisé : " DOMAINE
    if [[ -z "$DOMAINE" ]]; then
        echo "Domaine invalide."
        exit 1
    fi
else
    echo "Choix invalide."
    exit 1
fi

# Configurer dnsmasq
echo "Configuration de dnsmasq..."

cat <<EOF > /etc/dnsmasq.conf
# Configuration de dnsmasq

# Interface réseau principale
interface=$(ip route show default | awk '/default/ {print $5}')
listen-address=127.0.0.1,$IP_SERVEUR

# Activer le service DHCP
dhcp-range=${DHCP_START},${DHCP_END},12h

# Associer le nom de domaine
domain=${DOMAINE}

# Gestion des Alias
alias=8.8.8.8,$IP_SERVEUR

# Activer la mise à jour DNS dynamique pour les clients DHCP
dhcp-authoritative
expand-hosts
domain-needed
no-negcache
bogus-priv
filterwin2k
no-resolv
server=9.9.9.9
server=149.112.112.112

# Activer la journalisation pour voir les affectations DHCP/DNS
log-queries
log-dhcp

# Option DHCP
dhcp-option=1,255.255.255.0
# Passerelle par défaut
dhcp-option=3,$IP_SERVEUR
# DNS
dhcp-option=6,$IP_SERVEUR
# NIS Domain Name
# dhcp-option=40,$DOMAINE
# Domaine DNS
dhcp-option=15,$DOMAINE
# TTL des paquests (eviter les boucles réseau)
dhcp-option=23,64
# Taille MTU
dhcp-option=26,1500
# Désactiver NetBIOS sur Windows
dhcp-option=43,01:04:00:00:00:02
# Suffixe DNS
dhcp-option=119,$DOMAINE
# WPAD (Web Proxy Auto-Discovery Protocol)
dhcp-option=252,"\n"
dhcp-name-match=set:wpad-ignore,wpad
dhcp-ignore-names=tag:wpad-ignore

EOF

# Redémarrer dnsmasq pour appliquer les modifications
systemctl restart dnsmasq

echo "Configuration terminée avec succès!"
echo "Serveur DHCP/DNS fonctionnel sur $IP_SERVEUR"
echo "Les clients recevront une IP entre $DHCP_START et $DHCP_END et seront associés au domaine $DOMAINE"