#!/bin/bash
# Live-End-to-End-Test (serverseitig): Account -> Charakter -> Lobby -> echter UE-Server-Spawn
# -> Registrierung -> Port-Check -> Kapazitaets-Gate -> Cleanup.
set -u
API="http://127.0.0.1:8090"
cd /opt/projectcat-backend || exit 1
SECRET=$(grep -E "^SERVER_SECRET=" .env | cut -d= -f2-)
TS=$(date +%s)
EMAIL="livetest_${TS}@bugforge.de"
PASS="Test1234!"

j() { python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('$1',''))" 2>/dev/null; }

echo "== 1) Registrieren =="
curl -s -X POST "$API/auth/register" -H "Content-Type: application/json" \
  -d "{\"email\":\"$EMAIL\",\"password\":\"$PASS\"}" -o /dev/null -w "  http=%{http_code}\n"

echo "== 2) Login =="
TOKEN=$(curl -s -X POST "$API/auth/login" -H "Content-Type: application/json" \
  -d "{\"email\":\"$EMAIL\",\"password\":\"$PASS\"}" | j access_token)
[ -n "$TOKEN" ] && echo "  Token erhalten: ${TOKEN:0:16}..." || { echo "  FEHLER: kein Token"; exit 1; }

echo "== 3) Charakter anlegen =="
CHAR=$(curl -s -X POST "$API/characters" -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -d "{\"name\":\"LiveHeld\",\"class_index\":0,\"spec_index\":0}")
CHARID=$(echo "$CHAR" | j id)
echo "  Charakter-ID=$CHARID"

echo "== 4) Lobby erstellen (spawnt echten UE-Server) =="
LOBBY=$(curl -s -X POST "$API/lobbies" -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -d "{\"name\":\"LiveLobby\",\"character_id\":$CHARID,\"map_name\":\"/Game/Maps/Hub\"}")
echo "  Antwort: $LOBBY"
LOBBYID=$(echo "$LOBBY" | j lobby_id)
PORT=$(echo "$LOBBY" | j server_port)
HOST=$(echo "$LOBBY" | j server_host)
TICKET=$(echo "$LOBBY" | j ticket)
echo "  Lobby-ID=$LOBBYID Host=$HOST Port=$PORT Ticket=${TICKET:0:12}..."
[ -n "$LOBBYID" ] || { echo "  FEHLER: keine Lobby erstellt"; exit 1; }

echo "== 5) Container-Status =="
docker ps --filter "name=projectcat-lobby-$LOBBYID" --format "  {{.Names}}  {{.Status}}  {{.Ports}}"

echo "== 6) Kapazitaets-Gate: 2. Lobby sollte 503 liefern =="
curl -s -X POST "$API/lobbies" -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -d "{\"name\":\"Lobby2\",\"character_id\":$CHARID,\"map_name\":\"/Game/Maps/Hub\"}" \
  -o /dev/null -w "  http=%{http_code} (erwartet 503)\n"

echo "== 7) Warte 20s, dann Registrierungs-/Boot-Status =="
sleep 20
STATUS=$(curl -s "$API/lobbies" -H "Authorization: Bearer $TOKEN")
echo "  offene Lobbys: $STATUS"
echo "  --- Server-Log (letzte 15 Zeilen) ---"
docker logs "projectcat-lobby-$LOBBYID" 2>&1 | tail -15 | sed 's/^/  /'

echo "== 8) UDP-Port lokal offen? =="
ss -uln 2>/dev/null | grep -q ":$PORT" && echo "  UDP $PORT LAUSCHT" || echo "  UDP $PORT nicht in ss (evtl. im Container-Namespace, das ist ok)"

echo "== 9) Cleanup: Lobby beenden + Container stoppen =="
curl -s -X POST "$API/internal/lobbies/$LOBBYID/end" -H "X-Server-Secret: $SECRET" \
  -o /dev/null -w "  end http=%{http_code}\n"
docker rm -f "projectcat-lobby-$LOBBYID" >/dev/null 2>&1 && echo "  Container entfernt" || echo "  (Container bereits weg)"
echo "== fertig =="
