#!/usr/bin/env bash
# =============================================================================
# Entrypoint — stack nginx + ja4ebpf
# Ordre : nginx → ja4ebpf (uprobes sur nginx/libssl)
# =============================================================================
set -eo pipefail

log() { echo "[entrypoint:nginx] $(date +%H:%M:%S) $*"; }

NGINX_PID=""
JA4EBPF_PID=""

cleanup() {
    log "Arrêt des processus…"
    [ -n "$JA4EBPF_PID" ] && kill "$JA4EBPF_PID" 2>/dev/null || true
    [ -n "$NGINX_PID"   ] && kill "$NGINX_PID"   2>/dev/null || true
    wait 2>/dev/null || true
}
trap cleanup EXIT SIGTERM SIGINT

# ── 1. Démarrage de nginx ─────────────────────────────────────────────────
log "Démarrage de nginx…"
nginx
NGINX_PID=$(cat /run/nginx/nginx.pid 2>/dev/null || pgrep nginx | head -1)

# Attendre que nginx soit opérationnel
for i in $(seq 1 20); do
    if curl -sf http://localhost/health >/dev/null 2>&1; then
        log "nginx opérationnel (PID $NGINX_PID)"
        break
    fi
    sleep 0.5
done

# ── 2. Démarrage de ja4ebpf ───────────────────────────────────────────────
log "Démarrage de ja4ebpf (attache uprobes sur libssl)…"
ja4ebpf -config /etc/ja4ebpf/config.yml &
JA4EBPF_PID=$!

log "Stack démarrée — nginx PID=$NGINX_PID ja4ebpf PID=$JA4EBPF_PID"

# Laisser ja4ebpf 3s pour détecter un échec immédiat (ex: verifier eBPF)
sleep 3
if ! kill -0 "$JA4EBPF_PID" 2>/dev/null; then
    log "⚠ ja4ebpf s'est arrêté immédiatement — mode dégradé (web server seul)"
    JA4EBPF_PID=""
fi

# ── 3. Supervision ────────────────────────────────────────────────────────
# nginx fonctionne en daemon : surveiller le process master via le PID file.
# ja4ebpf tourne en foreground (optionnel : ne pas quitter s'il s'arrête).
while true; do
    # Vérifier que nginx est toujours en vie
    if ! kill -0 "$NGINX_PID" 2>/dev/null; then
        NGINX_PID=$(cat /run/nginx/nginx.pid 2>/dev/null || echo "")
        if [ -z "$NGINX_PID" ] || ! kill -0 "$NGINX_PID" 2>/dev/null; then
            log "nginx s'est arrêté — fin de l'entrypoint"
            break
        fi
    fi
    # ja4ebpf est optionnel : loguer si arrêté mais ne pas quitter
    if [ -n "$JA4EBPF_PID" ] && ! kill -0 "$JA4EBPF_PID" 2>/dev/null; then
        log "⚠ ja4ebpf s'est arrêté — web server continue sans collecte eBPF"
        JA4EBPF_PID=""
    fi
    sleep 2
done
