#!/bin/bash
# Hält Webserver und Tunnel für die Gastro-KI-Demo am Leben.
# Idempotent: startet nur, was nicht läuft. Schreibt die aktuelle
# Tunnel-Adresse nach URL.txt, damit sie jederzeit nachlesbar ist.
#
# Aufruf:  bash /opt/data/projects/gastro-ki/serve.sh
# Prüfen:  bash /opt/data/projects/gastro-ki/serve.sh status

set -u
PROJEKT="/opt/data/projects/gastro-ki"
PORT=8080
URLDATEI="$PROJEKT/URL.txt"
LOGDIR="$PROJEKT/logs"
CF="/tmp/cloudflared"
mkdir -p "$LOGDIR"

# --- läuft der Webserver? ---
server_laeuft(){ pgrep -f "http.server $PORT" >/dev/null 2>&1; }

# --- läuft der Tunnel? ---
tunnel_laeuft(){ pgrep -f "cloudflared tunnel --url http://127.0.0.1:$PORT" >/dev/null 2>&1; }

starte_server(){
  cd "$PROJEKT" || exit 1
  # setsid löst den Prozess von der aufrufenden Sitzung — sonst wird er beim
  # Ende der Sitzung mit abgeräumt und die Demo ist wieder weg.
  setsid nohup python3 -m http.server "$PORT" --bind 0.0.0.0 \
    >>"$LOGDIR/server.log" 2>&1 < /dev/null &
  disown 2>/dev/null || true
  sleep 2
}

starte_tunnel(){
  [ -x "$CF" ] || {
    curl -sL --max-time 120 -o "$CF" \
      https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
    chmod +x "$CF"
  }
  # Neue Adresse landet im Log; alte Logs wegräumen, damit die Suche eindeutig ist
  : >"$LOGDIR/tunnel.log"
  setsid nohup "$CF" tunnel --url "http://127.0.0.1:$PORT" --no-autoupdate \
    >>"$LOGDIR/tunnel.log" 2>&1 < /dev/null &
  disown 2>/dev/null || true
  # Bis zu 30 s auf die Adresse warten
  for _ in $(seq 1 30); do
    sleep 1
    if grep -qE "https://[a-z0-9-]+\.trycloudflare\.com" "$LOGDIR/tunnel.log" 2>/dev/null; then
      break
    fi
  done
}

schreibe_url(){
  local url
  url=$(grep -oE "https://[a-z0-9-]+\.trycloudflare\.com" "$LOGDIR/tunnel.log" 2>/dev/null | tail -1)
  if [ -n "$url" ]; then
    {
      echo "$url"
      echo ""
      echo "Stand: $(date '+%d.%m.%Y %H:%M') Uhr"
      echo ""
      echo "Verwaltung:  $url/verwaltung.html"
      echo "Tablet:      $url/prototyp-tablet.html"
      echo ""
      echo "Beide Seiten immer aus derselben Quelle öffnen, sonst sieht das"
      echo "Tablet die Änderungen aus der Verwaltung nicht."
    } >"$URLDATEI"
    echo "Tunnel-Adresse: $url"
  else
    echo "Keine Tunnel-Adresse im Log gefunden — bitte $LOGDIR/tunnel.log prüfen."
  fi
}

fall_pruefen(){
  # Ein laufender Tunnel ohne Adresse im Log ist nutzlos (z. B. nach
  # Logrotation) — dann neu starten, damit URL.txt stimmt.
  if tunnel_laeuft && ! grep -qE "https://[a-z0-9-]+\.trycloudflare\.com" \
       "$LOGDIR/tunnel.log" 2>/dev/null; then
    pkill -f "cloudflared tunnel --url http://127.0.0.1:$PORT" >/dev/null 2>&1
    sleep 2
  fi
}

case "${1:-start}" in
  status)
    server_laeuft && echo "Webserver: läuft" || echo "Webserver: AUS"
    tunnel_laeuft && echo "Tunnel:    läuft" || echo "Tunnel:    AUS"
    [ -f "$URLDATEI" ] && { echo "---"; cat "$URLDATEI"; } || echo "keine URL.txt"
    exit 0
    ;;
  start)
    if server_laeuft; then echo "Webserver läuft bereits."; else
      echo "Webserver starten …"; starte_server; fi
    fall_pruefen
    if tunnel_laeuft; then echo "Tunnel läuft bereits."; else
      echo "Tunnel starten …"; starte_tunnel; fi
    schreibe_url
    ;;
  *)
    echo "Aufruf: bash $0 [start|status]" >&2
    exit 2
    ;;
esac
