#!/usr/bin/env bash
#
# mac-tunnel-autopush.sh — Mac Studio Ollama Cloudflare Quick-Tunnel
# mit automatischem Upstream-Push an den OpenClaw-VPS.
#
# Startet cloudflared, liest die trycloudflare.com-URL live aus dem Log,
# meldet sie an den VPS (/api/macstudio/set-base-url) und pusht erneut,
# falls Cloudflare bei einem Reconnect eine neue URL vergibt.
# Der OpenClaw-Provider bleibt dabei auf einem stabilen Proxy-Endpunkt;
# nur der dahinterliegende Mac-Upstream wird gedreht.
#
# Installation am Mac:
#   curl -fsSL https://files.raumkommander.at/mac-tunnel-autopush.sh -o ~/mac-tunnel-autopush.sh
#   chmod +x ~/mac-tunnel-autopush.sh
#   ~/mac-tunnel-autopush.sh
#
# Als Dauerdienst (LaunchAgent) siehe Block am Dateiende.

set -uo pipefail

# ── Konfiguration ───────────────────────────────────────────
PUSH_URL="https://files.raumkommander.at/api/macstudio/set-base-url"
PUSH_TOKEN="uWbriD1swXFfUWVf_SaVfkPQL2rSnl1l"
OLLAMA_LOCAL="http://localhost:11434"
LOGFILE="${HOME}/mac-tunnel-autopush.log"
WARMUP_MODEL="${WARMUP_MODEL:-qwen3.6:latest}"   # Modell, das nach Start in den RAM geladen wird
WARMUP_KEEP_ALIVE="${WARMUP_KEEP_ALIVE:--1}"     # -1 = für immer im RAM halten
# ────────────────────────────────────────────────────────────

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOGFILE"; }

push_url() {
  local url="$1"
  log "Pushe Mac-Upstream an VPS: $url"
  local code
  code=$(curl -s -o /tmp/macpush.out -w "%{http_code}" -m 15 \
    -X POST "$PUSH_URL" \
    -H "Content-Type: application/json" \
    -H "X-Mac-Token: ${PUSH_TOKEN}" \
    -d "{\"url\":\"${url}\"}")
  if [ "$code" = "200" ]; then
    log "✅ VPS hat URL übernommen (HTTP 200)."
  else
    log "⚠️ VPS-Push fehlgeschlagen (HTTP $code): $(cat /tmp/macpush.out 2>/dev/null)"
  fi
}

prewarm_model() {
  # Lädt das Modell in den RAM und hält es dort (keep_alive: -1 = unbegrenzt).
  # Wird im Hintergrund ausgeführt, blockiert den Tunnel-Loop nicht.
  (
    local model="$WARMUP_MODEL"
    local ka="$WARMUP_KEEP_ALIVE"
    log "🔥 Pre-Warm: lade '${model}' in RAM (keep_alive=${ka})…"
    local start_ts=$(date +%s)
    local resp_code
    resp_code=$(curl -s -o /tmp/macwarmup.out -w "%{http_code}" -m 600 \
      -X POST "${OLLAMA_LOCAL}/api/generate" \
      -H "Content-Type: application/json" \
      -d "{\"model\":\"${model}\",\"prompt\":\"ok\",\"stream\":false,\"keep_alive\":${ka},\"options\":{\"num_predict\":1}}")
    local elapsed=$(($(date +%s) - start_ts))
    if [ "$resp_code" = "200" ]; then
      log "✅ Pre-Warm fertig in ${elapsed}s — '${model}' bleibt im RAM (keep_alive=${ka})."
    else
      log "⚠️ Pre-Warm fehlgeschlagen (HTTP ${resp_code}, ${elapsed}s): $(head -c 200 /tmp/macwarmup.out 2>/dev/null)"
      log "   Tipp: 'ollama pull ${model}' am Mac falls Modell fehlt."
    fi
  ) &
}

# Ollama sicherstellen
if ! curl -s -m 5 "${OLLAMA_LOCAL}/api/tags" >/dev/null 2>&1; then
  log "Ollama nicht erreichbar — starte via brew services…"
  brew services start ollama >/dev/null 2>&1 || true
  sleep 3
fi

# Pre-Warm direkt nach Ollama-Check (parallel, blockiert nicht)
prewarm_model

log "Starte cloudflared Quick-Tunnel auf ${OLLAMA_LOCAL} …"

LAST_URL=""
# cloudflared in einen Lese-Loop pipen; stderr+stdout zusammenführen.
cloudflared tunnel --url "${OLLAMA_LOCAL}" 2>&1 | while IFS= read -r line; do
  echo "$line" >> "$LOGFILE"
  # URL aus jeder Zeile fischen, die eine trycloudflare.com-Adresse enthält
  url=$(echo "$line" | grep -oE 'https://[a-z0-9-]+\.trycloudflare\.com' | head -n1)
  if [ -n "$url" ] && [ "$url" != "$LAST_URL" ]; then
    LAST_URL="$url"
    log "Neue Tunnel-URL erkannt: $url"
    # kurz warten bis der Tunnel reachable ist, dann pushen
    sleep 4
    push_url "$url"
  fi
done

log "cloudflared beendet."

# ── Optional: als LaunchAgent dauerhaft laufen lassen ────────
# Datei: ~/Library/LaunchAgents/com.raumkommander.mactunnel.plist
#
# <?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>com.raumkommander.mactunnel</string>
#   <key>ProgramArguments</key>
#     <array><string>/bin/bash</string>
#            <string>/Users/RAUMKOMMANDER/mac-tunnel-autopush.sh</string></array>
#   <key>RunAtLoad</key><true/>
#   <key>KeepAlive</key><true/>
#   <key>StandardOutPath</key><string>/tmp/mactunnel.out</string>
#   <key>StandardErrorPath</key><string>/tmp/mactunnel.err</string>
# </dict></plist>
#
# Aktivieren:
#   launchctl load ~/Library/LaunchAgents/com.raumkommander.mactunnel.plist
#   launchctl start com.raumkommander.mactunnel
