#!/usr/bin/env bash
# Gitea-Repo-Anlage für Lucy (17.07.2026): schließt die Lücke im „Projekte selbst
# starten"-Weg — bislang konnte die Werkstatt nur Branches in BESTEHENDE Repos
# proposen, aber kein neues Projekt-Repo anlegen.
#
# Nutzung:  gitea-repo-create.sh <name> ["Beschreibung"]
# Ergebnis (stdout, letzte Zeile): CLONE <https-clone-url>   → Aufrufer kann direkt klonen.
#
# HARTE Sicherheits-Leitplanken (Gitea ist öffentlich erreichbar!):
#   • Repos werden IMMER PRIVAT angelegt (kein öffentliches Repo aus Versehen).
#   • Token wird aus ~/.git-credentials gelesen, NIE ausgegeben/geloggt.
#   • Jede Anlage wird protokolliert (Audit-Spur) + still an die Chronik gespiegelt.
# Braucht ein Token mit Scope `write:user` (zusätzlich zu `write:repository`); ohne das
# meldet Gitea 403 — das Skript sagt dann genau, was zu tun ist (Token in Gitea neu
# generieren), statt kryptisch zu scheitern.
set -uo pipefail

NAME="${1:-}"
BESCHREIBUNG="${2:-Von Lucy angelegtes Projekt-Repo.}"
CRED="$HOME/.git-credentials"
# Dediziertes Anlage-Token (Scope write:user) — GETRENNT vom Push-Token in
# ~/.git-credentials, damit ein Überschreiben nie Push/PR bricht. Priorität:
# ENV GITEA_CREATE_TOKEN → ~/.config/gitea/create-token → Fallback .git-credentials.
CREATE_TOKEN_FILE="$HOME/.config/gitea/create-token"
LOG="$HOME/.hermes/state/gitea-repos-created.log"

if [ -z "$NAME" ]; then
  echo "Nutzung: gitea-repo-create.sh <name> [\"Beschreibung\"]" >&2
  exit 2
fi
# Repo-Name defensiv prüfen (Gitea erlaubt Buchstaben/Ziffern/-/_/.)
if ! printf '%s' "$NAME" | grep -qE '^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$'; then
  echo "Ungültiger Repo-Name '$NAME' (erlaubt: Buchstaben/Ziffern/.-_, Beginn alphanumerisch)." >&2
  exit 2
fi
# User + Host sind NICHT geheim: aus .git-credentials ableiten, sonst Standardwerte.
LINE="$(grep -m1 'git\.tobisniceshomelab\.ddnsfree\.com' "$CRED" 2>/dev/null || head -1 "$CRED" 2>/dev/null || true)"
USER="$(printf '%s' "$LINE" | sed -nE 's#https://([^:]+):.*#\1#p')"; USER="${USER:-Hitonabi}"
HOST="$(printf '%s' "$LINE" | sed -nE 's#https://[^@]+@([^/]+).*#\1#p')"; HOST="${HOST:-git.tobisniceshomelab.ddnsfree.com}"
BASE="https://${HOST}"

# Anlage-Token bestimmen (dediziert bevorzugt, damit Push-Token unberührt bleibt)
if [ -n "${GITEA_CREATE_TOKEN:-}" ]; then
  TOKEN="$GITEA_CREATE_TOKEN"
elif [ -r "$CREATE_TOKEN_FILE" ]; then
  TOKEN="$(tr -d '[:space:]' < "$CREATE_TOKEN_FILE")"
else
  TOKEN="$(printf '%s' "$LINE" | sed -nE 's#https://[^:]+:([^@]+)@.*#\1#p')"
fi
if [ -z "$TOKEN" ]; then
  echo "Kein Gitea-Token gefunden (weder \$GITEA_CREATE_TOKEN noch $CREATE_TOKEN_FILE noch ~/.git-credentials)." >&2
  exit 1
fi

RESP="$(mktemp)"; trap 'rm -f "$RESP"' EXIT
CODE="$(curl -s -o "$RESP" -w '%{http_code}' -X POST "$BASE/api/v1/user/repos" \
  -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
  -d "$(python3 -c 'import json,sys; print(json.dumps({"name":sys.argv[1],"description":sys.argv[2],"private":True,"auto_init":True,"default_branch":"main"}))' "$NAME" "$BESCHREIBUNG")")"

case "$CODE" in
  201)
    CLONE="$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1])).get("clone_url",""))' "$RESP" 2>/dev/null)"
    FULL="$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1])).get("full_name",""))' "$RESP" 2>/dev/null)"
    mkdir -p "$(dirname "$LOG")"
    echo "$(date '+%Y-%m-%d %H:%M')  angelegt (privat): $FULL" >> "$LOG"
    # Stiller Chronik-Spiegel (Audit-Spur, wie die Radar-Meldungen)
    curl -sf -m 5 -X POST "${MC_ANNOUNCE_URL:-http://127.0.0.1:9001/api/voice/announce}" \
      -H 'Content-Type: application/json' \
      --data "$(python3 -c 'import json,sys; print(json.dumps({"text":"Neues PRIVATES Projekt-Repo angelegt: "+sys.argv[1],"subject":"Gitea","source":"gitea-repo-create","priority":"silent"}))' "$FULL")" \
      >/dev/null 2>&1 || true
    echo "Repo '$FULL' angelegt (privat, main initialisiert)."
    echo "CLONE ${CLONE}"
    exit 0 ;;
  403)
    if grep -q 'write:user' "$RESP"; then
      echo "FEHLT: Das benutzte Gitea-Token darf keine Repos anlegen (Scope 'write:user' fehlt)." >&2
      echo "So wird es freigeschaltet (einmalig, durch den Commander):" >&2
      echo "  1) In Gitea ein Token mit Scope 'write:user' erzeugen (nur DAS reicht fürs Anlegen)." >&2
      echo "  2) Den Token-Wert in ~/.config/gitea/create-token legen (chmod 600) —" >&2
      echo "     getrennt vom Push-Token, das in ~/.git-credentials unberührt bleibt." >&2
    else
      echo "403 von Gitea:" >&2; head -c 300 "$RESP" >&2; echo >&2
    fi
    exit 3 ;;
  409)
    echo "Ein Repo namens '$NAME' existiert bereits." >&2
    exit 4 ;;
  *)
    echo "Gitea antwortete mit HTTP $CODE:" >&2; head -c 300 "$RESP" >&2; echo >&2
    exit 1 ;;
esac
