#!/usr/bin/env bash
# ============================================================================
# ORBIT Player — WLAN-Setup-CLI-Wrapper (Phase 15)
# Lumeon Media UG (haftungsbeschraenkt)
#
# Verwendung:
#   admin-wifi-setup          # Startet Backend + Xorg + Chromium-Kiosk auf TTY2
#
# Lifecycle (CONTEXT D-13):
#   1. Techniker: Ctrl+Alt+F2 -> TTY2 -> Login orbit
#   2. admin-wifi-setup
#   3. Script startet Flask-Backend auf 127.0.0.1:8081 (BG)
#   4. Wartet bis Backend bereit (max 10s)
#   5. Startet Xorg + Chromium per xinit -- :1 vt2
#   6. BLOCKIERT bis chromium endet
#   7. Cleanup-Trap: kill Backend, log
# ============================================================================
set -uo pipefail

REPO=/opt/orbit-player
LOG=/var/log/orbit-wifi-setup.log
BACKEND_LOG=/var/log/orbit-wifi-setup-backend.log
TAG=orbit-wifi-setup
PORT=8081

# Logger-Pattern (orbit-update.sh-Style)
ts() { date '+%Y-%m-%d %H:%M:%S'; }
log()  { local m; m="$(ts) [SETUP]  $*"; echo "$m" | tee -a "$LOG" >/dev/null;
         echo "[SETUP] $*"; logger -t "$TAG" "$*" 2>/dev/null || true; }
info() { local m; m="$(ts) [INFO]   $*"; echo "$m" | tee -a "$LOG" >/dev/null;
         echo "[INFO]  $*"; logger -t "$TAG" "$*" 2>/dev/null || true; }
warn() { local m; m="$(ts) [WARN]   $*"; echo "$m" | tee -a "$LOG" >/dev/null;
         echo "[WARN]  $*" >&2; logger -t "$TAG" "WARN: $*" 2>/dev/null || true; }
err()  { local m; m="$(ts) [FEHLER] $*"; echo "$m" | tee -a "$LOG" >/dev/null;
         echo "[FEHLER] $*" >&2; logger -t "$TAG" "FEHLER: $*" 2>/dev/null || true; }

log "=== Setup-Session start ==="
info "Repo: $REPO"
info "TTY:  $(tty 2>/dev/null || echo unbekannt)"
info "User: $(whoami)"

# ---------- Pre-Check 1: Port frei? ----------
if ss -lnt 2>/dev/null | grep -q "127.0.0.1:${PORT}"; then
    err "Port $PORT ist schon belegt (lokales Backend laeuft bereits?)."
    err "Bitte beende den anderen Prozess und versuche es erneut."
    exit 1
fi

# ---------- Pre-Check 2: Repo-Pfad existiert ----------
if [[ ! -d "$REPO/wifi_setup" ]]; then
    err "wifi_setup-Verzeichnis nicht gefunden unter $REPO/wifi_setup"
    err "Deploy fehlt? Pruefe scripts/15-deploy-wifi-setup.sh"
    exit 1
fi

# ---------- Backend starten (Background) ----------
log "Starte Flask-Backend auf 127.0.0.1:${PORT} (BG) ..."
# Wichtig: cwd = REPO damit Python 'wifi_setup' und 'orbit-player' findet
(
    cd "$REPO"
    python3 -m wifi_setup.backend
) >>"$BACKEND_LOG" 2>&1 &
BACKEND_PID=$!
info "Backend PID=$BACKEND_PID, Log=$BACKEND_LOG"

# ---------- Cleanup-Trap (immer) ----------
cleanup() {
    local rc=$?
    log "Cleanup: stoppe Backend (PID=$BACKEND_PID) ..."
    kill -TERM "$BACKEND_PID" 2>/dev/null || true
    # Bis 5s warten, dann KILL
    local i=0
    while kill -0 "$BACKEND_PID" 2>/dev/null && [[ $i -lt 10 ]]; do
        sleep 0.5; i=$((i+1))
    done
    if kill -0 "$BACKEND_PID" 2>/dev/null; then
        warn "Backend reagiert nicht auf SIGTERM, sende SIGKILL"
        kill -KILL "$BACKEND_PID" 2>/dev/null || true
    fi
    wait "$BACKEND_PID" 2>/dev/null || true
    log "=== Setup-Session end (exit $rc) ==="
    exit $rc
}
trap cleanup EXIT INT TERM HUP

# ---------- Warten bis Backend bereit (Health-Check) ----------
info "Warte auf Backend-Health-Check ..."
for i in {1..20}; do
    if curl -fsS "http://127.0.0.1:${PORT}/api/health" >/dev/null 2>&1; then
        info "Backend bereit nach ${i} Versuchen"
        break
    fi
    sleep 0.5
done
if ! curl -fsS "http://127.0.0.1:${PORT}/api/health" >/dev/null 2>&1; then
    err "Backend nicht erreichbar nach 10s. Abbruch."
    err "Pruefe $BACKEND_LOG fuer Details."
    exit 1
fi

# ---------- Xorg + Chromium starten (BLOCKIEREND) ----------
log "Starte Xorg + Chromium-Kiosk (xinit -- :1 vt2) ..."
info "TV-Display sollte in 5-15s die WLAN-Setup-Seite zeigen."

# WICHTIG: :1 = neue Display-Nummer, vt2 = explizite VT (Pitfall #2)
# -nolisten tcp = X11-Security (kein TCP-Listening), -keeptty = TTY nach Exit
xinit "$REPO/scripts/wifi-setup-kiosk.sh" -- :1 vt2 -nolisten tcp -keeptty \
    2>&1 | tee -a "$LOG" || true

# Wenn xinit endet, faellt das Script in die Cleanup-Trap (oben)
log "Chromium-Kiosk beendet. Bitte Ctrl+Alt+F1 zum Player zurueck."
