#!/bin/sh
# ============================================================================
#  pre-commit  --  Schutzhook fuer den lokalen Coding-Agent
#
#  Blockiert einen Commit, bevor etwas hineinkommt, das man aus einer Git-
#  History nur noch per History-Rewrite entfernt: Secrets, Modellgewichte,
#  Binaries, Grossdateien.
#
#  Der Hook liegt versioniert unter scripts/git-hooks/ und wird von
#  scripts/install-git-hooks.ps1 nach .git/hooks/ kopiert -- .git/hooks/ selbst
#  wird von Git nicht versioniert, deshalb der Umweg.
#
#  Bewusste Ausnahme:  git commit --no-verify
# ============================================================================

MAX_BYTES=5242880          # 5 MiB
REPORT=$(mktemp)
trap 'rm -f "$REPORT"' EXIT

staged=$(git diff --cached --name-only --diff-filter=ACM)
[ -z "$staged" ] && exit 0

printf '%s\n' "$staged" | while IFS= read -r f; do
  [ -n "$f" ] || continue

  # --- 1) Verbotene Pfade / Endungen ---------------------------------------
  case "$f" in
    secrets/*|*/secrets/*)
      printf ' [SECRET]  %s\n           Alles unter secrets/ gehoert nie in die History.\n' "$f" ;;
    *.key|*.crt|*.pem|*.pfx|*.p12)
      printf ' [SECRET]  %s\n           Zertifikat/privater Schluessel.\n' "$f" ;;
    *.gguf|*.safetensors)
      printf ' [MODELL]  %s\n           Modellgewichte gehoeren nicht ins Repo (Download-Skript nutzen).\n' "$f" ;;
    *.dll|*.exe|*.msi|*.zip|*.7z)
      printf ' [BINARY]  %s\n           Binaries werden installiert, nicht versioniert.\n' "$f" ;;
  esac

  # --- 2) Groesse des GESTAGETEN Blobs (nicht der Arbeitskopie) ------------
  size=$(git cat-file -s ":$f" 2>/dev/null)
  if [ -n "$size" ] && [ "$size" -gt "$MAX_BYTES" ]; then
    printf ' [GROSS]   %s  (%s KB, Limit %s KB)\n' "$f" "$((size / 1024))" "$((MAX_BYTES / 1024))"
  fi

  # --- 3) Secret-Muster im Inhalt ------------------------------------------
  # sk-no-key-required ist kein Geheimnis: llama-server verlangt irgendeinen Wert.
  hit=$(git show ":$f" 2>/dev/null \
        | grep -nEi '(api[_-]?key|password|secret|token)[[:space:]]*[:=][[:space:]]*["'"'"']?[A-Za-z0-9_/+-]{20,}' \
        | grep -v 'sk-no-key-required' | head -3)
  if [ -n "$hit" ]; then
    printf ' [MUSTER]  %s\n' "$f"
    printf '%s\n' "$hit" | sed 's/^/           /'
  fi
done > "$REPORT"

if [ -s "$REPORT" ]; then
  echo ""
  echo "=============================================================="
  echo " COMMIT BLOCKIERT -- pre-commit-Hook"
  echo "=============================================================="
  cat "$REPORT"
  echo ""
  echo " Beheben:  git restore --staged <datei>    (aus dem Commit nehmen)"
  echo "           danach den Pfad in .gitignore aufnehmen."
  echo " Bewusst trotzdem committen:  git commit --no-verify"
  echo ""
  exit 1
fi

exit 0
