#!/bin/bash
# install_feeder_universal.sh
# VERSION : v1.3 — 2026-06-03 — sans mlat-client obligatoire, multi-source GPS
# COMPAT  : Debian Buster/Bullseye/Bookworm/Trixie — armv7l/arm64/x86_64
# DEPLOY  : https://radarvirtuel.com/dl/install_feeder_universal.sh

set -e
RV_URL="https://radarvirtuel.com"
INSTALL_DIR="/opt/feeder_rv"
SERVICE_NAME="feeder_rv"
FEEDER_SCRIPT="feeder_radarvirtuel.py"

echo "============================================"
echo " RadarVirtuel — Installation Feeder"
echo " $(date '+%Y-%m-%d %H:%M:%S')"
echo "============================================"

DEBIAN_VER=$(cat /etc/debian_version 2>/dev/null | cut -d. -f1 || echo "?")
CODENAME=$(grep VERSION_CODENAME /etc/os-release 2>/dev/null | cut -d= -f2 || echo "unknown")
ARCH=$(uname -m)
echo "[INFO] Debian $DEBIAN_VER ($CODENAME) — $ARCH"

# ── CPU UID ───────────────────────────────────────────────────
CPU_UID=$(grep Serial /proc/cpuinfo 2>/dev/null | awk '{print $3}' | head -1)
if [ -z "$CPU_UID" ]; then
    CPU_UID=$(cat /sys/class/net/eth0/address 2>/dev/null | tr -d ':' || echo "")
fi
if [ -z "$CPU_UID" ]; then
    CPU_UID=$(cat /etc/machine-id 2>/dev/null | head -c 16 || echo "")
fi
if [ -z "$CPU_UID" ]; then
    echo "[ERROR] Impossible de trouver un identifiant unique"
    exit 1
fi
echo "[OK] CPU UID : $CPU_UID"

# ── LAT / LON / ALT / LABEL — multi-source ───────────────────
LAT=""; LON=""; ALT="0"; STATION_LABEL=""

# Source 1 — mlat-client
if [ -f "/etc/default/mlat-client" ]; then
    LAT=$(grep '^LAT=' /etc/default/mlat-client | cut -d'"' -f2)
    LON=$(grep '^LON=' /etc/default/mlat-client | cut -d'"' -f2)
    ALT=$(grep '^ALT=' /etc/default/mlat-client | cut -d'"' -f2 || echo "0")
    SERVER_USER=$(grep '^SERVER_USER=' /etc/default/mlat-client | cut -d'"' -f2)
    STATION_LABEL=$(echo "${SERVER_USER:-}" | tr '[:lower:]' '[:upper:]')
    [ -n "$LAT" ] && echo "[OK] Config depuis mlat-client"
fi

# Source 2 — dump1090-fa
if [ -z "$LAT" ] && [ -f "/etc/default/dump1090-fa" ]; then
    LAT=$(grep 'LAT' /etc/default/dump1090-fa | grep -oP '[\-0-9\.]+' | head -1)
    LON=$(grep 'LON' /etc/default/dump1090-fa | grep -oP '[\-0-9\.]+' | head -1)
    ALT=$(grep 'ALT\|altitude' /etc/default/dump1090-fa | grep -oP '[0-9]+' | head -1 || echo "0")
    [ -n "$LAT" ] && echo "[OK] Config depuis dump1090-fa"
fi

# Source 3 — readsb
if [ -z "$LAT" ] && [ -f "/etc/default/readsb" ]; then
    LAT=$(grep 'lat=' /etc/default/readsb | grep -oP '[\-0-9\.]+' | head -1)
    LON=$(grep 'lon=' /etc/default/readsb | grep -oP '[\-0-9\.]+' | head -1)
    ALT=$(grep 'alt=' /etc/default/readsb | grep -oP '[0-9]+' | head -1 || echo "0")
    [ -n "$LAT" ] && echo "[OK] Config depuis readsb"
fi

# Source 4 — FlightRadar24
if [ -z "$LAT" ] && [ -f "/etc/fr24feed.ini" ]; then
    LAT=$(grep '^receiver-lat' /etc/fr24feed.ini | cut -d= -f2 | tr -d ' ')
    LON=$(grep '^receiver-lon' /etc/fr24feed.ini | cut -d= -f2 | tr -d ' ')
    ALT=$(grep '^receiver-alt' /etc/fr24feed.ini | cut -d= -f2 | tr -d ' ' || echo "0")
    [ -n "$LAT" ] && echo "[OK] Config depuis fr24feed"
fi

# Source 5 — RadarBox
if [ -z "$LAT" ] && [ -f "/etc/rb-feeder.ini" ]; then
    LAT=$(grep 'lat' /etc/rb-feeder.ini | grep -oP '[\-0-9\.]+' | head -1)
    LON=$(grep 'lon' /etc/rb-feeder.ini | grep -oP '[\-0-9\.]+' | head -1)
    [ -n "$LAT" ] && echo "[OK] Config depuis rb-feeder"
fi

# Source 6 — tar1090 receiver.json (position connue)
if [ -z "$LAT" ] && [ -f "/run/readsb/receiver.json" ]; then
    LAT=$(python3 -c "import json;d=json.load(open('/run/readsb/receiver.json'));print(d.get('lat',''))" 2>/dev/null || echo "")
    LON=$(python3 -c "import json;d=json.load(open('/run/readsb/receiver.json'));print(d.get('lon',''))" 2>/dev/null || echo "")
    [ -n "$LAT" ] && echo "[OK] Config depuis receiver.json"
fi

# Source 7 — Saisie manuelle interactive
if [ -z "$LAT" ] || [ -z "$LON" ]; then
    echo ""
    echo "[INFO] Aucune configuration GPS trouvée automatiquement."
    echo "[INFO] Veuillez saisir les coordonnées de votre station :"
    echo ""
    read -r -p "  Latitude  (ex: 48.6076)  : " LAT
    read -r -p "  Longitude (ex: -1.6956)  : " LON
    read -r -p "  Altitude en mètres (ex: 25) : " ALT
    ALT=${ALT:-0}
fi

# Validation coordonnées
if [ -z "$LAT" ] || [ -z "$LON" ]; then
    echo "[ERROR] LAT/LON manquants — abandon"
    exit 1
fi
echo "[OK] Position : lat=$LAT lon=$LON alt=${ALT}m"

# ── Label station — suggestion terrain le plus proche ────────
if [ -z "$STATION_LABEL" ]; then
    echo ""
    echo "[INFO] Recherche du terrain le plus proche..."
    NEAREST=$(python3 - << PYEOF2
import json, sys
try:
    import requests
    r = requests.get(
        "${RV_URL}/api/nearest_airport",
        params={"lat": "${LAT}", "lon": "${LON}", "limit": 5},
        timeout=10)
    airports = r.json().get("airports", [])
    if airports:
        print("Terrains proches de votre position :")
        for i, a in enumerate(airports):
            lbl = a.get('suggested_label', a['icao_code']+'1')
            avail = "✓ disponible" if a.get('label_available', True) else "✗ pris"
            print(f"  {i+1}. {lbl} — {a['name']} ({a['municipality']}) — {a['distance_km']} km [{avail}]")
        best = airports[0].get('suggested_label', airports[0]['icao_code']+'1')
        print(f"\nSuggestion : {best}")
        print(f"SUGGESTION={best}")
    else:
        print("SUGGESTION=")
except Exception as e:
    print(f"SUGGESTION=")
PYEOF2
)
    echo "$NEAREST" | grep -v "^SUGGESTION="
    SUGGESTED=$(echo "$NEAREST" | grep "^SUGGESTION=" | cut -d= -f2)
    echo ""
    echo "[INFO] Format recommandé : code ICAO + numéro (ex: ${SUGGESTED}1, ${SUGGESTED}2)"
    read -r -p "  Label station [${SUGGESTED}1] : " STATION_LABEL
    STATION_LABEL=${STATION_LABEL:-"${SUGGESTED}1"}
    STATION_LABEL=$(echo "$STATION_LABEL" | tr '[:lower:]' '[:upper:]' | tr -d ' ')
fi

if [ -z "$STATION_LABEL" ]; then
    echo "[ERROR] Label station manquant — abandon"
    exit 1
fi
echo "[OK] Station  : $STATION_LABEL"

# ── Optionnel — infos contributeur ───────────────────────────
read -r -p "  Votre nom (optionnel, Entrée pour ignorer) : " CONTRIB_NAME
read -r -p "  Votre email (optionnel, Entrée pour ignorer) : " CONTRIB_EMAIL
CONTRIB_NAME=${CONTRIB_NAME:-"Contributeur RadarVirtuel"}
CONTRIB_EMAIL=${CONTRIB_EMAIL:-""}

# ── Fix APT Buster EOL ────────────────────────────────────────
if [ "$CODENAME" = "buster" ] && ! python3 -c "import requests" 2>/dev/null; then
    if ! apt-get update -qq 2>/dev/null; then
        echo "[APT] Buster EOL -> archive.debian.org..."
        cat > /etc/apt/sources.list << 'APTEOF'
deb http://archive.debian.org/debian buster main contrib non-free
deb http://archive.debian.org/debian-security buster/updates main contrib non-free
APTEOF
        echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf.d/99archive
        apt-get update -qq 2>/dev/null || true
    fi
fi

if ! python3 -c "import requests" 2>/dev/null; then
    echo "[APT] Installation python3-requests..."
    apt-get install -y python3-requests 2>/dev/null || \
    apt-get install -y --allow-unauthenticated python3-requests 2>/dev/null || \
    { echo "[ERROR] python3-requests introuvable"; exit 1; }
fi
echo "[OK] python3-requests OK"

# ── Enregistrement API ────────────────────────────────────────
echo "[API] Enregistrement station $STATION_LABEL..."
RESPONSE=$(python3 - << PYEOF
import json, sys
try:
    import requests
    r = requests.post(
        "${RV_URL}/api/station/register",
        json={
            "station_uid":   "${CPU_UID}",
            "station_label": "${STATION_LABEL}",
            "lat":           float("${LAT}"),
            "lon":           float("${LON}"),
            "alt_m":         float("${ALT:-0}"),
            "description":   "${STATION_LABEL} — auto-registered",
            "contrib_name":  "${CONTRIB_NAME}",
            "contrib_email": "${CONTRIB_EMAIL}"
        },
        timeout=15)
    print(json.dumps(r.json()))
except Exception as e:
    print(json.dumps({"ok": False, "message": str(e)}))
PYEOF
)
echo "[API] Reponse: $RESPONSE"

REG_OK=$(echo "$RESPONSE" | python3 -c "import json,sys;d=json.load(sys.stdin);print('yes' if d.get('ok') else 'no')")
if [ "$REG_OK" != "yes" ]; then
    echo "[ERROR] Enregistrement echoue"
    exit 1
fi
REG_STATUS=$(echo "$RESPONSE" | python3 -c "import json,sys;d=json.load(sys.stdin);print(d.get('status','?'))")
echo "[OK] Statut: $REG_STATUS"

# ── Installation feeder ───────────────────────────────────────
mkdir -p "$INSTALL_DIR"
cat > "${INSTALL_DIR}/config.json" << CFGEOF
{
  "_version": "v1.3 — $(date '+%Y-%m-%d %H:%M UTC') — auto-generated",
  "terrain": {
    "nom": "${STATION_LABEL}",
    "icao": "${STATION_LABEL}",
    "latitude": ${LAT},
    "longitude": ${LON},
    "altitude_m": ${ALT:-0}
  },
  "radarvirtuel": {
    "enabled": true,
    "url": "${RV_URL}/api/feed",
    "station_uid": "${CPU_UID}",
    "interval_s": 5
  }
}
CFGEOF
echo "[OK] config.json genere"

curl -sf -o "${INSTALL_DIR}/${FEEDER_SCRIPT}" "${RV_URL}/dl/${FEEDER_SCRIPT}" || \
  { echo "[ERROR] Impossible de telecharger ${FEEDER_SCRIPT}"; exit 1; }
chmod +x "${INSTALL_DIR}/${FEEDER_SCRIPT}"
echo "[OK] feeder_radarvirtuel.py en place"

cat > /etc/systemd/system/${SERVICE_NAME}.service << SVCEOF
[Unit]
Description=RadarVirtuel Feeder — ${STATION_LABEL}
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=${INSTALL_DIR}
ExecStart=/usr/bin/python3 ${INSTALL_DIR}/${FEEDER_SCRIPT}
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
SVCEOF

systemctl daemon-reload
systemctl enable ${SERVICE_NAME}
systemctl restart ${SERVICE_NAME}
sleep 3
STATUS=$(systemctl is-active ${SERVICE_NAME})
echo "[SERVICE] Statut : $STATUS"
echo ""
echo "============================================"
echo " Installation terminee — $STATION_LABEL"
echo " Logs : journalctl -u ${SERVICE_NAME} -f"
echo "============================================"
