#!/usr/bin/env bash
set -euo pipefail

# ─── CONFIGURATION ─────────────────────────────────────────────
UDM_HOST="udm.inxs.me"         # Adresse de l’UDM Pro (nom DNS ou IP)
UDM_USER="root"                # Utilisateur (par défaut root)
NETWORK_CIDR="192.168.10.0/24" # Réseau à scanner
DHCP_START="192.168.10.100"    # Début du DHCP pool
DHCP_END="192.168.10.200"      # Fin du DHCP pool
PING_TIMEOUT=0.5               # Durée du ping (en secondes)
# ──────────────────────────────────────────────────────────────

echo "🔍 Recherche d'une IP libre sur $NETWORK_CIDR (DHCP $DHCP_START → $DHCP_END)..."

# Convertit une IP en entier
ip2int() {
  local IFS=. ip=$1
  read -r o1 o2 o3 o4 <<< "$ip"
  echo $(( (o1 << 24) + (o2 << 16) + (o3 << 8) + o4 ))
}

# Convertit un entier en IP
int2ip() {
  local ip dec=$1
  for e in 1 2 3 4; do
    ip=$((dec & 255))${ip:+.}$ip
    dec=$((dec >> 8))
  done
  echo "$ip"
}

# Récupère les IPs DHCP attribuées sur le UDM
USED_IPS=$(ssh "$UDM_USER@$UDM_HOST" "cat /var/run/ubnt-dhcp.leases 2>/dev/null" | awk '{print $3}' | sort -u)

# Calcul bornes
start=$(ip2int "$DHCP_START")
end=$(ip2int "$DHCP_END")

# Boucle sur la plage DHCP
for (( ip_int = start; ip_int <= end; ip_int++ )); do
  ip=$(int2ip "$ip_int")

  # Vérifie si IP est déjà utilisée dans les leases
  if grep -q "$ip" <<< "$USED_IPS"; then
    echo "⚠️  $ip déjà dans les leases"
    continue
  fi

  # Ping test
  if ping -c 1 -W "$PING_TIMEOUT" "$ip" >/dev/null 2>&1; then
    echo "⚠️  $ip répond au ping (probablement utilisée)"
    continue
  fi

  # Si ni utilisée ni répondante, c’est bon
  echo "✅ IP disponible : $ip"
  exit 0
done

echo "❌ Aucune IP libre trouvée dans la plage DHCP."
exit 1