#!/bin/bash
# ============================================================================
# Prüfungshilfe — Schnellinstallation für macOS
#
# Installiert alles, was der Claude-Code-Skill „pruefungsvorbereitung-v2“
# braucht: Homebrew, poppler/ffmpeg/ghostscript, Python (python.org),
# docling + mlx-whisper + faster-whisper + hf, die KI-Modelle und Claude Code.
#
# Sicher mehrfach ausführbar: Bereits Installiertes wird erkannt und
# übersprungen — nach einem Abbruch einfach erneut starten.
#
# Ausführen:  curl -fsSL https://inweb.page/pruefungshilfe/install.sh | bash
# Quelle:     https://inweb.page/pruefungshilfe (manuelle Anleitung ebenda)
#
# Diese Datei liegt im Repo unter pruefungshilfe/install.sh und wird in den
# Supabase-Bucket „pruefungshilfe“ hochgeladen (Auslieferung über die Edge
# Function pruefungshilfe-download). Nach Änderungen neu hochladen!
# ============================================================================
set -euo pipefail

BLUE=$'\033[1;34m'; GREEN=$'\033[1;32m'; YELLOW=$'\033[1;33m'; RED=$'\033[1;31m'; NC=$'\033[0m'
step() { printf '\n%s==> %s%s\n' "$BLUE" "$1" "$NC"; }
ok()   { printf '%s  ✓ %s%s\n' "$GREEN" "$1" "$NC"; }
info() { printf '%s  · %s%s\n' "$YELLOW" "$1" "$NC"; }
fail() { printf '\n%s✗ %s%s\n' "$RED" "$1" "$NC"; exit 1; }

PY_VERSION="3.12.8"
PY_MAJOR_MINOR="3.12"
PY_PKG_URL="https://www.python.org/ftp/python/${PY_VERSION}/python-${PY_VERSION}-macos11.pkg"
PY_BIN_DIR="/Library/Frameworks/Python.framework/Versions/${PY_MAJOR_MINOR}/bin"
SKILL_NAME="pruefungsvorbereitung-v2"

[[ "$(uname)" == "Darwin" ]] || fail "Dieses Skript ist nur für macOS gedacht."
ARCH="$(uname -m)"

printf '\n%s╭──────────────────────────────────────────────╮%s\n' "$BLUE" "$NC"
printf '%s│  Prüfungshilfe — Schnellinstallation (macOS)  │%s\n' "$BLUE" "$NC"
printf '%s╰──────────────────────────────────────────────╯%s\n' "$BLUE" "$NC"
info "Dauer: ca. 30–45 Minuten, überwiegend Wartezeit."
info "Wenn nach deinem Passwort gefragt wird: einfach tippen und Enter —"
info "die Eingabe bleibt unsichtbar, das ist normal."
if [[ "$ARCH" != "arm64" ]]; then
  info "Hinweis: Intel-Mac erkannt — die schnelle Spracherkennung (mlx) braucht"
  info "einen Apple-Chip; die Prüfungshilfe nutzt dann automatisch faster-whisper."
fi

# ----------------------------------------------------------------------------
step "Schritt 1/7 — Homebrew (Paketmanager)"
# ----------------------------------------------------------------------------
if command -v brew >/dev/null 2>&1; then
  ok "Homebrew ist schon installiert ($(brew --version | head -1))"
else
  info "Homebrew wird installiert — hier kommt die Passwortabfrage."
  NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  ok "Homebrew installiert"
fi
for BREW_PATH in /opt/homebrew/bin/brew /usr/local/bin/brew; do
  if [[ -x "$BREW_PATH" ]]; then
    eval "$("$BREW_PATH" shellenv)"
    if ! grep -qs 'brew shellenv' ~/.zprofile; then
      printf 'eval "$(%s shellenv)"\n' "$BREW_PATH" >> ~/.zprofile
      ok "Homebrew in ~/.zprofile eingetragen"
    fi
    break
  fi
done
command -v brew >/dev/null 2>&1 || fail "Homebrew wurde nicht gefunden — bitte Terminal neu öffnen und Skript erneut starten."

# ----------------------------------------------------------------------------
step "Schritt 2/7 — Basis-Werkzeuge (poppler, ffmpeg, ghostscript)"
# ----------------------------------------------------------------------------
# Erkennung über das eigentliche Programm (nicht das brew-Paket), damit auch
# anderweitig installierte Werkzeuge als vorhanden gelten.
for EINTRAG in "poppler:pdftotext" "ffmpeg:ffmpeg" "ghostscript:gs"; do
  PKG="${EINTRAG%%:*}"
  BIN="${EINTRAG##*:}"
  if command -v "$BIN" >/dev/null 2>&1; then
    ok "$PKG ist schon installiert ($BIN gefunden)"
  else
    brew install "$PKG"
    ok "$PKG installiert"
  fi
done

# ----------------------------------------------------------------------------
step "Schritt 3/7 — Python (python.org)"
# ----------------------------------------------------------------------------
# Homebrew-Python sperrt pip („externally-managed-environment“), deshalb das
# offizielle python.org-Paket. Erkennungslogik: vorhandenes python3 ohne
# EXTERNALLY-MANAGED-Sperre reicht aus.
python_ok() {
  command -v python3 >/dev/null 2>&1 || return 1
  python3 - <<'PYEOF' >/dev/null 2>&1
import os, sys, sysconfig
sys.exit(1 if sys.version_info < (3, 10) else
         1 if os.path.exists(os.path.join(sysconfig.get_path("stdlib"), "EXTERNALLY-MANAGED")) else 0)
PYEOF
}
if python_ok; then
  ok "Passendes Python ist schon installiert ($(python3 --version))"
else
  info "Python ${PY_VERSION} wird geladen und installiert (Passwortabfrage möglich) …"
  curl -fsSL -o /tmp/pruefungshilfe-python.pkg "$PY_PKG_URL"
  sudo installer -pkg /tmp/pruefungshilfe-python.pkg -target /
  rm -f /tmp/pruefungshilfe-python.pkg
  export PATH="${PY_BIN_DIR}:$PATH"
  if ! grep -qs "$PY_BIN_DIR" ~/.zprofile; then
    printf 'export PATH="%s:$PATH"\n' "$PY_BIN_DIR" >> ~/.zprofile
  fi
  ok "Python installiert ($(python3 --version))"
fi

# ----------------------------------------------------------------------------
step "Schritt 4/7 — KI-Werkzeuge (docling, mlx-whisper, faster-whisper, hf)"
# ----------------------------------------------------------------------------
info "pip prüft/installiert die Pakete — beim ersten Mal einige Minuten."
python3 -m pip install --quiet --disable-pip-version-check \
  docling mlx-whisper faster-whisper "huggingface_hub[cli]"
ok "KI-Werkzeuge bereit ($(docling --version 2>/dev/null | head -1 || echo 'docling installiert'))"

# ----------------------------------------------------------------------------
step "Schritt 5/7 — KI-Modelle vorladen (~2,7 GB beim ersten Mal)"
# ----------------------------------------------------------------------------
if [[ "$ARCH" == "arm64" ]]; then
  info "Spracherkennungs-Modell whisper-turbo (~1,6 GB) …"
  hf download mlx-community/whisper-turbo >/dev/null
  ok "whisper-turbo im Cache"
else
  info "Intel-Mac: whisper-turbo (mlx) wird übersprungen — faster-whisper lädt"
  info "sein Modell beim ersten Einsatz selbst."
fi
info "Dokument-Modelle für docling (~1,1 GB) …"
docling-tools models download >/dev/null
ok "docling-Modelle im Cache"

# ----------------------------------------------------------------------------
step "Schritt 6/7 — Claude Code"
# ----------------------------------------------------------------------------
if command -v claude >/dev/null 2>&1 || [[ -x "$HOME/.local/bin/claude" ]]; then
  ok "Claude Code ist schon installiert"
else
  curl -fsSL https://claude.ai/install.sh | bash
  ok "Claude Code installiert — beim ersten Start von „claude“ meldest du dich einmalig an."
fi

# ----------------------------------------------------------------------------
step "Schritt 7/7 — Prüfungshilfe-Skill"
# ----------------------------------------------------------------------------
if [[ -d "$HOME/.claude/skills/$SKILL_NAME" ]]; then
  ok "Skill ist schon installiert (~/.claude/skills/$SKILL_NAME)"
elif [[ -f "$HOME/Downloads/$SKILL_NAME.zip" ]]; then
  mkdir -p "$HOME/.claude/skills"
  unzip -oq "$HOME/Downloads/$SKILL_NAME.zip" -d "$HOME/.claude/skills/"
  ok "Skill aus ~/Downloads installiert"
elif [[ -d "$HOME/Downloads/$SKILL_NAME" ]]; then
  mkdir -p "$HOME/.claude/skills"
  cp -R "$HOME/Downloads/$SKILL_NAME" "$HOME/.claude/skills/"
  ok "Skill aus ~/Downloads installiert (entpackter Ordner)"
else
  info "Skill-Datei nicht gefunden. Lade sie auf https://inweb.page/pruefungshilfe"
  info "herunter (kurzes Formular) und starte dieses Skript danach einfach"
  info "noch einmal — alles Fertige wird übersprungen."
fi

# ----------------------------------------------------------------------------
step "Abschluss-Check"
# ----------------------------------------------------------------------------
FEHLER=0
check() {
  if eval "$2" >/dev/null 2>&1; then
    ok "$1"
  else
    printf '%s  ✗ %s%s\n' "$RED" "$1" "$NC"; FEHLER=1
  fi
}
check "pdftotext"   "command -v pdftotext"
check "ffmpeg"      "command -v ffmpeg"
check "ghostscript" "command -v gs"
check "python3"     "python_ok"
check "docling"     "command -v docling"
[[ "$ARCH" == "arm64" ]] && check "mlx_whisper" "command -v mlx_whisper"
check "hf"          "command -v hf"
check "Claude Code" "command -v claude || test -x \"$HOME/.local/bin/claude\""
check "Skill"       "test -d \"$HOME/.claude/skills/$SKILL_NAME\""

echo
if [[ "$FEHLER" == "0" ]]; then
  printf '%s🎉 Alles bereit!%s So legst du los:\n' "$GREEN" "$NC"
  printf '   1. Neues Terminal-Fenster öffnen\n'
  printf '   2. In den Ordner mit deinen Kursunterlagen wechseln, z. B.:  cd ~/Documents/MeinKurs\n'
  printf '   3. „claude“ starten und  /%s  eingeben\n' "$SKILL_NAME"
else
  printf '%sEinzelne Punkte fehlen noch%s — öffne ein neues Terminal-Fenster und starte\n' "$YELLOW" "$NC"
  printf 'das Skript erneut. Hilfe: https://inweb.page/pruefungshilfe#hilfe\n'
fi
