#!/bin/bash
# install-macmini-autopush.sh
# Einmal-Installation des LaunchAgents für macmini-tunnel-autopush am Mac mini M4.
#
# Mac mini M4 läuft LM Studio (Port 1234), NICHT Ollama.
#
# Lädt Tunnel-Script, legt LaunchAgent an (autostart bei Login + Reboot, KeepAlive).
# Räumt vorhandene Ollama-Quick-Tunnel/Konflikte auf.
#
# Verwendung am Mac mini:
#   curl -fsSL https://files.raumkommander.at/install-macmini-autopush.sh | bash
#
# Mit fixer Named-Tunnel-URL (empfohlen, einmal cloudflared tunnel login vorher):
#   curl -fsSL https://files.raumkommander.at/install-macmini-autopush.sh | \
#     CF_NAMED_TUNNEL=macmini-raumkommander \
#     CF_NAMED_HOSTNAME=macmini.raumkommander.at \
#     bash
#
# Mit abweichendem LM Studio Port:
#   curl -fsSL https://files.raumkommander.at/install-macmini-autopush.sh | LMSTUDIO_PORT=1235 bash

set -e

SCRIPT="$HOME/macmini-tunnel-autopush.sh"
PLIST="$HOME/Library/LaunchAgents/com.raumkommander.macmini.plist"
LABEL="com.raumkommander.macmini"
UID_NUM=$(id -u)

CF_NAMED_TUNNEL="${CF_NAMED_TUNNEL:-}"
CF_NAMED_HOSTNAME="${CF_NAMED_HOSTNAME:-}"
LMSTUDIO_PORT="${LMSTUDIO_PORT:-1234}"

echo "[1/6] Script herunterladen → $SCRIPT"
mkdir -p "$HOME/Library/LaunchAgents"
curl -fsSL https://files.raumkommander.at/macmini-tunnel-autopush.sh -o "$SCRIPT"
chmod +x "$SCRIPT"

echo "[2/6] cloudflared/brew suchen"
CF_BIN=$(command -v cloudflared || true)
BREW_BIN=$(command -v brew || true)
if [ -z "$CF_BIN" ]; then
  echo "❌ cloudflared nicht gefunden. Installier es: brew install cloudflared"
  exit 1
fi
PATH_LIST="$(dirname "$CF_BIN")"
[ -n "$BREW_BIN" ] && PATH_LIST="$PATH_LIST:$(dirname "$BREW_BIN")"
PATH_LIST="$PATH_LIST:/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"
echo "    cloudflared: $CF_BIN"
echo "    PATH:        $PATH_LIST"
echo "    LM Studio Port: $LMSTUDIO_PORT"

echo "[2b/6] LM Studio Server-Check (Port $LMSTUDIO_PORT)"
if curl -s -m 4 "http://127.0.0.1:${LMSTUDIO_PORT}/v1/models" >/dev/null 2>&1; then
  MODEL_COUNT=$(curl -s -m 4 "http://127.0.0.1:${LMSTUDIO_PORT}/v1/models" | grep -oE '"id"' | wc -l | tr -d ' ')
  echo "    ✅ LM Studio antwortet ($MODEL_COUNT Modelle)"
else
  echo "    ⚠️  LM Studio NICHT erreichbar auf 127.0.0.1:${LMSTUDIO_PORT}"
  echo "       → Im LM Studio: 'Developer' Tab → 'Start Server' (Port ${LMSTUDIO_PORT}, CORS Enable + Serve on Local Network)"
  echo "       Installation läuft trotzdem weiter — Tunnel startet sobald LM Studio läuft."
fi

echo "[2c/6] Konflikt-Cleanup: alte Ollama-Quick-Tunnels stoppen"
# Quick-Tunnel auf 11434 (Ollama) killen — wir wollen nur den auf $LMSTUDIO_PORT
pkill -f 'cloudflared tunnel --url http://localhost:11434' 2>/dev/null || true
echo "    (alte Ollama-Quick-Tunnels beendet, falls vorhanden)"

# Named-Tunnel Setup-Check
if [ -n "$CF_NAMED_TUNNEL" ] && [ -n "$CF_NAMED_HOSTNAME" ]; then
  echo "[2d/6] Named-Tunnel: $CF_NAMED_TUNNEL → $CF_NAMED_HOSTNAME"
  if [ ! -d "$HOME/.cloudflared" ] || [ -z "$(ls $HOME/.cloudflared/*.json 2>/dev/null)" ]; then
    echo ""
    echo "⚠️  Cloudflare-Login fehlt. Führe diese Schritte AM MAC MINI aus:"
    echo "    1) cloudflared tunnel login            # Browser öffnet, einloggen"
    echo "    2) cloudflared tunnel create $CF_NAMED_TUNNEL"
    echo "    3) cloudflared tunnel route dns $CF_NAMED_TUNNEL $CF_NAMED_HOSTNAME"
    echo "    4) Config schreiben: ~/.cloudflared/config.yml"
    echo "       ----"
    echo "       tunnel: $CF_NAMED_TUNNEL"
    echo "       credentials-file: ~/.cloudflared/<TUNNEL-ID>.json"
    echo "       ingress:"
    echo "         - hostname: $CF_NAMED_HOSTNAME"
    echo "           service: http://localhost:$LMSTUDIO_PORT"
    echo "         - service: http_status:404"
    echo "       ----"
    echo "    5) Dann dieses Installer-Script erneut starten."
    echo ""
    exit 1
  else
    echo "    ✅ ~/.cloudflared Credentials gefunden"
  fi
fi

echo "[3/6] Alte LaunchAgent-Instanz entfernen"
launchctl bootout "gui/$UID_NUM/$LABEL" 2>/dev/null || true
rm -f "$PLIST"

echo "[4/6] plist schreiben → $PLIST"
cat > "$PLIST" <<PLISTEOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>$LABEL</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/bash</string>
    <string>$SCRIPT</string>
  </array>
  <key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key>
    <string>$PATH_LIST</string>
    <key>HOME</key>
    <string>$HOME</string>
    <key>LMSTUDIO_PORT</key>
    <string>$LMSTUDIO_PORT</string>
$( [ -n "$CF_NAMED_TUNNEL" ] && [ -n "$CF_NAMED_HOSTNAME" ] && cat <<EXTRA
    <key>CF_NAMED_TUNNEL</key>
    <string>$CF_NAMED_TUNNEL</string>
    <key>CF_NAMED_HOSTNAME</key>
    <string>$CF_NAMED_HOSTNAME</string>
EXTRA
)
  </dict>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>ThrottleInterval</key>
  <integer>30</integer>
  <key>StandardOutPath</key>
  <string>$HOME/macmini-tunnel.out.log</string>
  <key>StandardErrorPath</key>
  <string>$HOME/macmini-tunnel.err.log</string>
</dict>
</plist>
PLISTEOF

echo "[5/6] LaunchAgent laden"
launchctl bootstrap "gui/$UID_NUM" "$PLIST"
launchctl enable "gui/$UID_NUM/$LABEL"
launchctl kickstart -k "gui/$UID_NUM/$LABEL"

echo "[6/6] Status"
sleep 3
launchctl print "gui/$UID_NUM/$LABEL" 2>/dev/null | grep -E "state|last exit|pid" | head -5 || echo "  (noch nicht geladen)"

echo ""
echo "✅ Fertig. Logs:"
echo "    tail -f $HOME/macmini-tunnel-autopush.log"
echo "    tail -f $HOME/macmini-tunnel.out.log"
echo ""
if [ -n "$CF_NAMED_HOSTNAME" ]; then
  echo "Public URL: https://$CF_NAMED_HOSTNAME (fix, dauerhaft)"
else
  echo "Quick-Tunnel-Modus: URL wechselt, wird auto-gepusht. Aktuelle URL:"
  echo "    curl -s https://files.raumkommander.at/api/macmini/health"
fi
echo ""
echo "Mac-mini-Dashboard: https://files.raumkommander.at/macmini.html"
