#!/usr/bin/env bash
#
# Golden-Master-Test für den LBM Brennpunkt-Manager.
# Erfasst die HTML-Ausgabe kuratierter Seiten (eingeloggt) und vergleicht sie
# gegen eine Baseline. Zweck: verhaltens-erhaltende Refactorings absichern —
# ein leerer Diff bedeutet, dass sich die Ausgabe nicht verändert hat.
#
# Nutzung (aus dem Projektstamm):
#   tests/goldenmaster.sh capture   # Baseline vom aktuellen Stand aufnehmen
#   tests/goldenmaster.sh check     # aktuellen Stand gegen Baseline vergleichen
#
# Zugangsdaten: tests/.auth (git-ignoriert; Zeile 1 Login, Zeile 2 Passwort)
#   oder Umgebungsvariablen LBM_TEST_USER / LBM_TEST_PASS.
# Ziel-URL: Standard https://lbm.lsvv.ch.ddev.site, überschreibbar via BASE_URL.
#
# Seitenliste: tests/urls.txt

set -u
DIR="$(cd "$(dirname "$0")" && pwd)"
BASE_URL="${BASE_URL:-https://lbm.lsvv.ch.ddev.site}"
URLS="$DIR/urls.txt"

MODE="${1:-}"
case "$MODE" in
    capture) OUT="$DIR/baseline" ;;
    check)   OUT="$DIR/snapshot" ;;
    *) echo "Nutzung: $0 {capture|check}" >&2; exit 1 ;;
esac

# --- Zugangsdaten laden ---
if [ -f "$DIR/.auth" ]; then
    USER="$(sed -n '1p' "$DIR/.auth")"
    PASS="$(sed -n '2p' "$DIR/.auth")"
else
    USER="${LBM_TEST_USER:-}"
    PASS="${LBM_TEST_PASS:-}"
fi
if [ -z "$USER" ] || [ -z "$PASS" ]; then
    echo "Keine Zugangsdaten. tests/.auth anlegen (siehe tests/.auth.example)" >&2
    echo "oder LBM_TEST_USER / LBM_TEST_PASS setzen." >&2
    exit 1
fi

COOKIE="$(mktemp)"
trap 'rm -f "$COOKIE"' EXIT

# --- Determinismus: "zuletzt besucht" des Test-Users leeren (best effort) ---
# Sonst verändern die Detailseiten-Abrufe die Startseiten-Ausgabe zwischen den Läufen.
ddev mysql -N 2>/dev/null <<SQL || true
DELETE lv FROM tabLastVisited lv
  JOIN tabUser u ON u.usrID = lv.lsvFkUser
  WHERE u.usrLogin = '${USER}';
SQL

# --- Login ---
code=$(curl -sk -c "$COOKIE" -b "$COOKIE" -o /dev/null -w '%{http_code}' \
    --data-urlencode "username=$USER" --data-urlencode "password=$PASS" \
    "$BASE_URL/login/authenticate.php")
if [ "$code" != "302" ]; then
    echo "Login-Endpunkt antwortete unerwartet (HTTP $code) — Server/DB prüfen." >&2
    exit 1
fi
# Ein FEHLGESCHLAGENER Login liefert EBENFALLS 302 (Redirect auf ?fail=1).
# Der Statuscode allein beweist also nichts. Session daher echt prüfen: eine
# geschützte Seite muss angemeldet Inhalt liefern (HTTP 200 mit Rumpf), nicht
# erneut auf den Login umleiten. Ohne diese Prüfung erfasst das Skript bei
# gescheiterter Anmeldung stillschweigend leere Seiten (0 Byte) und ist
# vakuum-grün.
probe=$(curl -sk -b "$COOKIE" -o /dev/null -w '%{http_code}:%{size_download}' "$BASE_URL/index.php")
if [ "${probe%%:*}" != "200" ] || [ "${probe##*:}" -lt 500 ]; then
    echo "Login nicht wirksam (index.php: $probe) — Zugangsdaten/Test-User prüfen." >&2
    exit 1
fi

# --- Seiten abrufen + volatile Teile normalisieren ---
rm -rf "$OUT"; mkdir -p "$OUT"
n=0
while IFS= read -r url; do
    [ -z "$url" ] && continue
    case "$url" in \#*) continue ;; esac
    n=$((n + 1))
    slug=$(printf '%02d_%s' "$n" "$url" | tr -c 'A-Za-z0-9._-' '_')
    curl -sk -b "$COOKIE" "$BASE_URL$url" \
        | sed -E 's/token=[0-9a-f]+/token=TOKEN/g; s/(name=.datum. value=.)[0-9]{4}-[0-9]{2}-[0-9]{2}/\1DATE/g' \
        > "$OUT/$slug.html"
done < "$URLS"
# Schutz gegen still-leere Erfassung: die erste Seite muss echten Inhalt haben.
first=$(ls "$OUT"/*.html 2>/dev/null | head -1)
if [ -z "$first" ] || [ "$(wc -c < "$first")" -lt 500 ]; then
    echo "Erfasste Seiten sind (nahezu) leer — Erfassung abgebrochen." >&2
    exit 1
fi
echo "$n Seiten erfasst nach tests/$(basename "$OUT")/"

# --- Vergleich (nur check) ---
if [ "$MODE" = "check" ]; then
    if [ ! -d "$DIR/baseline" ]; then
        echo "Keine Baseline vorhanden — zuerst 'capture' ausführen." >&2
        exit 1
    fi
    if diff -ru "$DIR/baseline" "$DIR/snapshot" > "$DIR/diff.txt" 2>&1; then
        echo "OK — keine Abweichung zur Baseline (Verhalten unverändert)."
        rm -f "$DIR/diff.txt"
    else
        echo "ABWEICHUNG gefunden — Details in tests/diff.txt:"
        head -60 "$DIR/diff.txt"
        exit 1
    fi
fi
