#!/bin/bash
# WorkBuddy 云端配置工具 (macOS)
# 用法：首次运行前在终端执行一次 chmod +x "本文件路径"
# 未签名脚本可能被 Gatekeeper 拦截：在 Finder 中按住 Control 点击文件，选择“打开”，再确认“打开”。

CLOUD_URL="https://buddy.ai-cybernetics.com"
MODEL_BASE_URL="$CLOUD_URL/v1"
MODELS_PATH="$HOME/.workbuddy/models.json"
BACKUP_DIR="$HOME/.workbuddy/config-console-backups"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT

# ---------- 1. 输入 API Key ----------
KEY="$(osascript -e 'text returned of (display dialog "请输入你的 API Key（将用于登录并替换 WorkBuddy 模型配置）：" default answer "" with hidden answer with title "WorkBuddy 云端配置" buttons {"取消","替换配置"} default button "替换配置")' 2>/dev/null)"
# 用户点取消时 osascript 返回非 0，KEY 为空
if [ -z "$KEY" ]; then exit 0; fi

# ---------- 2. 登录换取 accessToken ----------
EXCHANGE_BODY='{"apiKey":"'"$KEY"'","device":{"id":"regi-mac","platform":"darwin"},"client":{"version":"0.4.5"}}'
EXCHANGE_RESP="$(curl -s --max-time 30 -X POST "$CLOUD_URL/v1/auth/key/exchange" -H "content-type: application/json" -d "$EXCHANGE_BODY")"
TOKEN="$(osascript -l JavaScript -e 'function run(a){try{var d=JSON.parse(a[0]);return d.accessToken||"";}catch(e){return "";}}' "$EXCHANGE_RESP" 2>/dev/null)"
if [ -z "$TOKEN" ]; then
  osascript -e 'display alert "登录失败" message "无法获取 accessToken，请检查 API Key 是否正确、网络是否畅通。" as critical' 2>/dev/null
  exit 0
fi

# ---------- 3. 拉取模型目录并构建配置 ----------
BOOT_RESP="$(curl -s --max-time 30 "$CLOUD_URL/v1/bootstrap" -H "authorization: Bearer $TOKEN")"
# JXA 解析 bootstrap，构建模型数组，返回 "数量<TAB>JSON"
BUILD_OUT="$(osascript -l JavaScript -e 'function run(a){try{var b=JSON.parse(a[0]);var c=b.catalog||b;var ms=c.models||[];if(!ms.length)return "ERROR:云端未返回模型列表";var k=a[1],fallback=a[2],gateway=(c.gateway&&c.gateway.baseUrl)||c.baseUrl||c.modelBaseUrl||c.endpoint||fallback;gateway=String(gateway).replace(/\/+$/,"").replace(/\/chat\/completions$/i,"");if(!/\/v1$/i.test(gateway))gateway+="/v1";var v=c.version||"cloud";var n=ms.filter(function(m){return m.id;}).map(function(m){var caps=m.capabilities||[];return {id:String(m.id),name:m.name||m.id,vendor:"Custom",url:gateway,apiKey:k,supportsToolCall:caps.indexOf("tools")>=0,supportsImages:!!m.supportsImages,supportsReasoning:caps.indexOf("reasoning")>=0,useCustomProtocol:false,maxInputTokens:m.maxInputTokens||null,maxOutputTokens:m.maxOutputTokens||null,iconUrl:m.iconUrl||null,managedBy:"workbuddy-regi-tool",managedVersion:v};});if(!n.length)return "ERROR:云端模型没有有效 ID";return n.length+"\t"+JSON.stringify(n,null,2);}catch(e){return "ERROR:"+e.message;}}' "$BOOT_RESP" "$KEY" "$MODEL_BASE_URL" 2>/dev/null)"

if [ -z "$BUILD_OUT" ] || [[ "$BUILD_OUT" == ERROR* ]]; then
  osascript -e "display alert \"拉取模型失败\" message \"${BUILD_OUT:-无响应}\" as critical" 2>/dev/null
  exit 0
fi

COUNT="${BUILD_OUT%%$'\t'*}"
MODELS_JSON="${BUILD_OUT#*$'\t'}"

# ---------- 4. 备份 + 原子写入 ----------
mkdir -p "$BACKUP_DIR"
TS="$(date +%Y-%m-%dT%H-%M-%S)"
if [ -f "$MODELS_PATH" ]; then cp "$MODELS_PATH" "$BACKUP_DIR/models-$TS.json"; fi
TMP_FILE="$TMP_DIR/models.json"
printf '%s\n' "$MODELS_JSON" > "$TMP_FILE"
mv "$TMP_FILE" "$MODELS_PATH"

# ---------- 5. 成功提示 ----------
osascript -e "display alert \"配置成功\" message \"已同步 $COUNT 个可用模型。现在可以关闭此窗口并使用 WorkBuddy。\"" 2>/dev/null
