#!/bin/bash
# Richtet menumaestro.aigenius.tech dauerhaft ein — auf dem HOST ausführen.
#
# Dieses Skript findet den Pfad zu den Demo-Dateien selbst, schreibt die
# Compose-Datei und startet den Container. Es ändert NICHTS am
# Hermes-Container, die laufende Sitzung bleibt also bestehen.
#
# Aufruf:  bash setup-subdomain.sh

set -u
DOMAIN="menumaestro.aigenius.tech"
NETZ="hermes-agent-r3tt_default"
ZIELDATEI="/root/docker-compose.menumaestro.yml"

echo "=== 1. Hermes-Container und Pfad zu den Demo-Dateien finden ==="

# Container finden, der /opt/data gemountet hat
HC=""
for c in $(docker ps --format '{{.Names}}'); do
  if docker inspect "$c" --format '{{range .Mounts}}{{.Destination}} {{end}}' 2>/dev/null | grep -q "/opt/data"; then
    HC="$c"; break
  fi
done

if [ -z "$HC" ]; then
  echo "FEHLER: Kein laufender Container mit /opt/data gefunden."
  echo "Läuft der Hermes-Container? Prüfe: docker ps"
  exit 1
fi
echo "Hermes-Container: $HC"

# Host-Pfad ermitteln, der auf /opt/data zeigt
BASIS=$(docker inspect "$HC" --format \
  '{{range .Mounts}}{{if eq .Destination "/opt/data"}}{{.Source}}{{end}}{{end}}' 2>/dev/null)

if [ -z "$BASIS" ]; then
  echo "FEHLER: Konnte den Host-Pfad für /opt/data nicht ermitteln."
  echo "Bitte manuell prüfen mit:"
  echo "  docker inspect $HC --format '{{range .Mounts}}{{.Source}} => {{.Destination}}{{\"\\n\"}}{{end}}'"
  exit 1
fi

DATEN="$BASIS/projects/gastro-ki"
echo "Host-Pfad der Demo-Dateien: $DATEN"

if [ ! -f "$DATEN/verwaltung.html" ]; then
  echo "FEHLER: Dort liegt keine verwaltung.html."
  echo "Gefundener Pfad: $DATEN"
  echo "Bitte den Pfad manuell prüfen."
  exit 1
fi
echo "Gefunden: verwaltung.html und prototyp-tablet.html"
echo

echo "=== 2. Traefik prüfen (Netzwerk und Zertifikats-Resolver) ==="

if ! docker network inspect "$NETZ" >/dev/null 2>&1; then
  echo "WARNUNG: Netz '$NETZ' existiert nicht. Vorhandene Netze:"
  docker network ls --format '  {{.Name}}'
  echo "Bitte den Namen oben im Skript bei NETZ= eintragen und erneut starten."
  exit 1
fi
echo "Netz '$NETZ' vorhanden."

# Zertifikats-Resolver im Traefik-Container suchen
TR=""
for c in $(docker ps --format '{{.Names}}'); do
  if docker inspect "$c" --format '{{.Config.Image}}' 2>/dev/null | grep -qi traefik; then
    TR="$c"; break
  fi
done

RESOLVER=""
if [ -n "$TR" ]; then
  echo "Traefik-Container: $TR"
  # In der Config des Containers nach certificatesResolvers suchen
  CFG=$(docker exec "$TR" sh -c \
    'cat /etc/traefik/traefik.yml /etc/traefik/traefik.yaml 2>/dev/null' 2>/dev/null || true)
  if [ -z "$CFG" ]; then
    CFG=$(docker inspect "$TR" --format '{{json .Mounts}}' 2>/dev/null || true)
  fi
  if echo "$CFG" | grep -q "certificatesResolvers"; then
    RESOLVER=$(echo "$CFG" | grep -A3 "certificatesResolvers" \
      | grep -oE "^\s{2,4}[a-zA-Z0-9_-]+:" | head -1 | tr -d ' :')
    echo "Zertifikats-Resolver gefunden: ${RESOLVER:-<Name nicht lesbar>}"
  else
    echo "HINWEIS: Kein certificatesResolvers in der Traefik-Config gefunden."
    echo "Dann bleibt vorerst das selbstsignierte Zertifikat (Browser warnen)."
    echo "Das Einrichten steht in SUBDOMAIN-SETUP.md, Abschnitt 'Zertifikat'."
  fi
else
  echo "HINWEIS: Kein Traefik-Container gefunden. Läuft Traefik auf dem Host statt in Docker?"
fi

# Resolver: gefundenen nutzen, sonst Standardnamen eintragen
[ -z "$RESOLVER" ] && RESOLVER="letsencrypt"
echo

echo "=== 3. Compose-Datei schreiben: $ZIELDATEI ==="

cat >"$ZIELDATEI" <<YAML
# Automatisch erzeugt von setup-subdomain.sh am $(date '+%d.%m.%Y %H:%M')
services:
  menumaestro:
    image: python:3.12-alpine
    container_name: menumaestro
    restart: unless-stopped
    working_dir: /srv
    volumes:
      - $DATEN:/srv:ro
    command: ["python3", "-m", "http.server", "8080", "--bind", "0.0.0.0", "--directory", "/srv"]
    networks:
      - hermes_net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.menumaestro.rule=Host(\`$DOMAIN\`)"
      - "traefik.http.routers.menumaestro.entrypoints=websecure"
      - "traefik.http.routers.menumaestro.tls=true"
      - "traefik.http.routers.menumaestro.tls.certresolver=$RESOLVER"
      - "traefik.http.routers.menumaestro.service=menumaestro"
      - "traefik.http.routers.menumaestro-http.rule=Host(\`$DOMAIN\`)"
      - "traefik.http.routers.menumaestro-http.entrypoints=web"
      - "traefik.http.routers.menumaestro-http.middlewares=menumaestro-https"
      - "traefik.http.middlewares.menumaestro-https.redirectscheme.scheme=https"
      - "traefik.http.services.menumaestro.loadbalancer.server.port=8080"
networks:
  hermes_net:
    external: true
    name: $NETZ
YAML

echo "Geschrieben. Inhalt:"
sed 's/^/  /' "$ZIELDATEI"
echo

echo "=== 4. Container starten ==="
docker compose -f "$ZIELDATEI" up -d 2>&1 | sed 's/^/  /'
echo

echo "=== 5. Warten, dann prüfen ==="
sleep 8
echo "Container-Status:"
docker ps --filter name=menumaestro --format '  {{.Names}} | {{.Status}}'
echo
echo "Interner Test (im Container):"
docker exec menumaestro python3 -c "
import urllib.request
try:
    r = urllib.request.urlopen('http://127.0.0.1:8080/verwaltung.html', timeout=5)
    print('  HTTP', r.status, '-', len(r.read()), 'Bytes')
except Exception as e:
    print('  FEHLER:', e)
" 2>&1 | sed 's/^/  /'
echo
echo "Test über die Domain (kann 10-60 s dauern, Let's Encrypt braucht einen Moment):"
for i in 1 2 3 4 5; do
  CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 "https://$DOMAIN/verwaltung.html" 2>/dev/null || echo "000")
  echo "  Versuch $i: HTTP $CODE"
  [ "$CODE" = "200" ] && break
  sleep 8
done
echo

echo "=== Fertig ==="
if [ "$CODE" = "200" ]; then
  echo "Die Demo ist erreichbar unter:"
  echo "  https://$DOMAIN/verwaltung.html"
  echo "  https://$DOMAIN/prototyp-tablet.html"
else
  echo "Noch nicht 200. Das ist oft normal, wenn Let's Encrypt noch arbeitet."
  echo "In 1-2 Minuten erneut prüfen:"
  echo "  curl -sI https://$DOMAIN/verwaltung.html | head -3"
  echo
  echo "Falls es dann noch scheitert, die Traefik-Logs ansehen:"
  [ -n "$TR" ] && echo "  docker logs --tail 50 $TR"
fi
echo
echo "Der Cloudflare-Tunnel läuft parallel weiter. Wenn die Domain geht,"
echo "kann der Wächter-Cronjob abgeschaltet werden — sag mir einfach Bescheid."
