#!/usr/bin/env bash
set -euo pipefail

# Signal AI Gateway - Codex Desktop setup

API_KEY="${1:-}"
GATEWAY_BASE="${GATEWAY_BASE_URL:-https://api.4stoken.cn}"
BASE_URL="${GATEWAY_BASE%/}/v1"
DEFAULT_MODEL="${GATEWAY_CODEX_DESKTOP_MODEL:-gpt-5.5}"
RESTART_DESKTOP="${CODEX_DESKTOP_RESTART:-1}"
CONFIG_DIR="$HOME/.codex"
CONFIG_FILE="$CONFIG_DIR/config.toml"
AUTH_FILE="$CONFIG_DIR/auth.json"
CATALOG_FILE="$CONFIG_DIR/signal-model-catalog.json"
DESKTOP_MODELS="gpt-5.5,gpt-5.4,gpt-5.4-mini,gpt-5.4-nano,gpt-5.3-codex,gpt-5.1-codex,gpt-5.3-codex-xhigh"

if [ -z "$API_KEY" ]; then
  printf '\033[1;31m错误：\033[0m请提供 Client Key\n'
  printf '用法: ... | bash -s -- sk-YOUR_KEY\n'
  exit 1
fi

mkdir -p "$CONFIG_DIR"

backup_file="$CONFIG_FILE.desktop-bak.$(date +%s)"
if [ -f "$CONFIG_FILE" ]; then
  cp "$CONFIG_FILE" "$backup_file"
  printf '\033[0;36m已备份\033[0m %s\n' "$backup_file"
fi

cat > "$CATALOG_FILE" <<EOF
{
  "models": [
    { "slug": "gpt-5.5", "display_name": "gpt-5.5", "provider": "signal" },
    { "slug": "gpt-5.4", "display_name": "gpt-5.4", "provider": "signal" },
    { "slug": "gpt-5.4-mini", "display_name": "gpt-5.4-mini", "provider": "signal" },
    { "slug": "gpt-5.4-nano", "display_name": "gpt-5.4-nano", "provider": "signal" },
    { "slug": "gpt-5.3-codex", "display_name": "gpt-5.3-codex", "provider": "signal" },
    { "slug": "gpt-5.1-codex", "display_name": "gpt-5.1-codex", "provider": "signal" },
    { "slug": "gpt-5.3-codex-xhigh", "display_name": "gpt-5.3-codex-xhigh", "provider": "signal" }
  ]
}
EOF

CONFIG_FILE="$CONFIG_FILE" BASE_URL="$BASE_URL" DEFAULT_MODEL="$DEFAULT_MODEL" python3 - <<'PY'
from pathlib import Path
import os

path = Path(os.environ["CONFIG_FILE"])
base_url = os.environ["BASE_URL"]
default_model = os.environ["DEFAULT_MODEL"]

prefix = f'''model_provider = "signal"
model = "{default_model}"
model_reasoning_effort = "medium"
model_catalog_json = "{path.parent / "signal-model-catalog.json"}"

[model_providers.signal]
name = "Signal Gateway"
base_url = "{base_url}"
wire_api = "responses"
env_key = "OPENAI_API_KEY"
requires_openai_auth = false

'''

existing = path.read_text() if path.exists() else ""
lines = existing.splitlines()
kept = []
skip_block = False

for line in lines:
    stripped = line.strip()
    if stripped in ('model_provider = "OpenAI"', 'model_provider = "signal"'):
        continue
    if stripped.startswith('model = '):
        continue
    if stripped.startswith('model_reasoning_effort = '):
        continue
    if stripped.startswith('model_catalog_json = '):
        continue
    if stripped.startswith('[model_providers.OpenAI]') or stripped.startswith('[model_providers.signal]'):
        skip_block = True
        continue
    if skip_block:
        if stripped.startswith('[') and not stripped.startswith('[model_providers.'):
            skip_block = False
        else:
            continue
    kept.append(line)

body = '\n'.join(kept).lstrip()
new_text = prefix + (body if not body else body + '\n')
if not new_text.endswith('\n'):
    new_text += '\n'
path.write_text(new_text)
PY

printf '\n\033[1;36m=== 4SToken Gateway -> Codex Desktop 一键接入 ===\033[0m\n\n'
printf 'Base URL: %s\n' "$BASE_URL"
printf 'API Key:  %s\n' "$API_KEY"
printf 'Model:    %s\n\n' "$DEFAULT_MODEL"
printf 'Codex 配置已写入: %s\n' "$CONFIG_FILE"
printf '模型目录已写入: %s\n' "$CATALOG_FILE"
printf 'Codex Desktop 支持模型: %s\n' "$DESKTOP_MODELS"

if command -v pbcopy >/dev/null 2>&1; then
  printf '%s' "$API_KEY" | pbcopy
  printf '\033[0;32m✓ API Key 已复制到剪贴板\033[0m\n'
elif command -v xclip >/dev/null 2>&1; then
  printf '%s' "$API_KEY" | xclip -selection clipboard
  printf '\033[0;32m✓ API Key 已复制到剪贴板\033[0m\n'
elif command -v xsel >/dev/null 2>&1; then
  printf '%s' "$API_KEY" | xsel --clipboard
  printf '\033[0;32m✓ API Key 已复制到剪贴板\033[0m\n'
fi

restart_codex_desktop() {
  printf '\n\033[1m尝试重启 Codex Desktop...\033[0m\n'
  if [ "$(uname -s)" = "Darwin" ]; then
    osascript -e 'tell application "Codex" to quit' >/dev/null 2>&1 || true
    osascript -e 'tell application "Codex Desktop" to quit' >/dev/null 2>&1 || true
    sleep 2
    open -a "Codex" >/dev/null 2>&1 || open -a "Codex Desktop" >/dev/null 2>&1 || {
      printf '\033[0;33m未能自动打开 Codex Desktop，请手动重新打开。\033[0m\n'
      return 0
    }
    printf '\033[0;32m✓ 已发送重启 Codex Desktop 指令\033[0m\n'
    return 0
  fi

  if command -v codex-desktop >/dev/null 2>&1; then
    pkill -f codex-desktop >/dev/null 2>&1 || true
    sleep 2
    nohup codex-desktop >/dev/null 2>&1 &
    printf '\033[0;32m✓ 已尝试重启 codex-desktop\033[0m\n'
    return 0
  fi

  printf '\033[0;33m当前系统未找到可自动启动的 Codex Desktop，请手动重新打开。\033[0m\n'
}

if [ "$RESTART_DESKTOP" = "1" ] || [ "$RESTART_DESKTOP" = "true" ]; then
  restart_codex_desktop
else
  printf '已跳过重启 Codex Desktop（可用 CODEX_DESKTOP_RESTART=0 关闭自动重启）\n'
fi

printf '\033[0;33m注意：如旧配置中还有 model_catalog_json，请删掉后重启。\033[0m\n'
