#!/usr/bin/env bash
#
# macmini-tunnel-autopush.sh — Mac mini M4 LM Studio Cloudflare-Tunnel
# mit automatischem Upstream-Push an den OpenClaw-VPS.
#
# Mac mini M4 läuft LM Studio (OpenAI-kompatibel auf Port 1234), NICHT Ollama.
#
# Modus 1 (Named Tunnel, FIX, bevorzugt):
#   Wenn CF_NAMED_TUNNEL gesetzt ist (z.B. "macmini-raumkommander"), wird
#   ein dauerhafter Tunnel mit fixer URL gestartet. URL wird einmal an den
#   VPS gepusht; ändert sich nicht mehr.
#
# Modus 2 (Quick Tunnel, Fallback):
#   Sonst startet cloudflared im Quick-Modus, liest die trycloudflare.com-URL
#   live aus dem Log und pusht sie an /api/macmini/set-base-url.
#
# Installation:
#   curl -fsSL https://files.raumkommander.at/install-macmini-autopush.sh | bash
#
# Manueller Test:
#   chmod +x ~/macmini-tunnel-autopush.sh && ~/macmini-tunnel-autopush.sh

set -uo pipefail

# ── Konfiguration ───────────────────────────────────────────
PUSH_URL="https://files.raumkommander.at/api/macmini/set-base-url"
PUSH_TOKEN="uWbriD1swXFfUWVf_SaVfkPQL2rSnl1l"
LMSTUDIO_PORT="${LMSTUDIO_PORT:-1234}"
LMSTUDIO_LOCAL="http://localhost:${LMSTUDIO_PORT}"
LOGFILE="${HOME}/macmini-tunnel-autopush.log"

# Named-Tunnel-Mode (FIX URL). Wenn leer → Fallback auf Quick-Tunnel.
CF_NAMED_TUNNEL="${CF_NAMED_TUNNEL:-}"
CF_NAMED_HOSTNAME="${CF_NAMED_HOSTNAME:-}"
# ────────────────────────────────────────────────────────────

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

push_url() {
  local url="$1"
  log "Pushe Mac-mini-Upstream an VPS: $url"
  local code
  code=$(curl -s -o /tmp/macmini-push.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/macmini-push.out 2>/dev/null)"
  fi
}

# LM Studio Erreichbarkeit prüfen (Best-Effort, blockiert nicht)
if curl -s -m 5 "${LMSTUDIO_LOCAL}/v1/models" >/dev/null 2>&1; then
  log "✅ LM Studio antwortet auf ${LMSTUDIO_LOCAL}/v1/models"
else
  log "⚠️ LM Studio nicht erreichbar auf ${LMSTUDIO_LOCAL} — bitte LM Studio Server starten (Developer-Tab → Start Server, Port ${LMSTUDIO_PORT}, CORS=*)"
fi

# ── Modus auswählen ───────────────────────────────────────────
if [ -n "$CF_NAMED_TUNNEL" ] && [ -n "$CF_NAMED_HOSTNAME" ]; then
  log "🔒 Named-Tunnel-Modus: $CF_NAMED_TUNNEL → https://$CF_NAMED_HOSTNAME"
  push_url "https://$CF_NAMED_HOSTNAME"
  log "Starte cloudflared Named-Tunnel '$CF_NAMED_TUNNEL'…"
  cloudflared tunnel run "$CF_NAMED_TUNNEL" 2>&1 | while IFS= read -r line; do
    echo "[cloudflared] $line" >> "$LOGFILE"
  done
  log "cloudflared (named) beendet."
else
  log "🌀 Quick-Tunnel-Modus (Fallback): URL wechselt, wird live gepusht"
  log "Starte cloudflared Quick-Tunnel auf ${LMSTUDIO_LOCAL}…"
  LAST_URL=""
  cloudflared tunnel --url "${LMSTUDIO_LOCAL}" 2>&1 | while IFS= read -r line; do
    echo "$line" >> "$LOGFILE"
    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"
      sleep 4
      push_url "$url"
    fi
  done
  log "cloudflared (quick) beendet."
fi
