#!/bin/zsh
# ============================================================
# copilot-ploxy Codex 一键配置（macOS 版，单文件）
#   1) 始终提示输入 plo_ key（已存在则覆盖），持久化 PROXY_API_KEY
#      - 写入 ~/.zshrc / ~/.bash_profile / ~/.bashrc（终端）
#      - launchctl setenv（当前会话 GUI 应用）
#      - LaunchAgent（重启后 GUI 应用仍可读取，等价 Windows 用户级环境变量）
#   2) 备份并写入 ~/.codex/config.toml（代理配置）
#   3) 备份并写入 ~/.codex/auth.json（apikey 模式 → 桌面端跳过登录界面）
#   4) 自动识别 codex CLI，提示完全重启 GUI 后确认
#
# 运行方式：
#   双击 setup_codex.command（Finder 双击；若未授权先执行一次
#     chmod +x setup_codex.command
#     xattr -dr com.apple.quarantine setup_codex.command  # 下载文件可能需要）
#   或在终端运行：  bash setup_codex.command
#
# ❗ 若双击提示“Apple 无法验证此脚本 / 可能包含恶意代码 / 无法打开”：
#   这是 macOS Gatekeeper 对“从网络/其他设备拷贝的文件”的隔离拦截（误报，
#   本文件只是普通纯文本 shell 脚本，无恶意代码）。任选一种解决：
#   1) 终端执行一次（最推荐，也最安全）：  bash setup_codex.command
#      —— 用 bash 直接运行不触发 Gatekeeper，且脚本会自动移除自身的隔离属性，
#         之后双击即可正常打开。
#   2) 终端手动移除隔离属性后再双击：
#        xattr -d com.apple.quarantine setup_codex.command
#   3) 右键点 setup_codex.command → 打开（一次放行后即可正常双击）。
# ============================================================

# 自愈：通过 bash 运行一次后，自动修复自身（移除 Gatekeeper 隔离属性 +
# 补可执行权限），之后 Finder 双击即可正常打开。对普通纯文本脚本无害。
chmod +x "$0" 2>/dev/null || true
xattr -d com.apple.quarantine "$0" 2>/dev/null || true

CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"

# ── 辅助：去首尾空白 ────────────────────────────────────────
trim() {
  local s="$*"
  s="${s#"${s%%[![:space:]]*}"}"
  s="${s%"${s##*[![:space:]]}"}"
  printf '%s' "$s"
}

# ── 1) key：始终提示输入，已存在则覆盖 ──────────────────────
printf '请输入 plo_ 开头的 API key（若已存在将覆盖）: '
read -r KEY
KEY="$(trim "$KEY")"
if [ -z "$KEY" ]; then
  echo "[ABORT] 未输入 key，已退出。"
  read -r -p "按回车键关闭窗口" _
  exit 1
fi
echo "[OK] 已接收 key（${KEY:0:6}...）"

# ── 2) 持久化环境变量 PROXY_API_KEY ─────────────────────────
# 2a) shell 配置文件（终端永久生效，替换已有行）
set_proxy_key_in_profile() {
  local profile="$1"
  [ -f "$profile" ] || return 0
  if grep -q '^export PROXY_API_KEY=' "$profile" 2>/dev/null; then
    sed -i '' '/^export PROXY_API_KEY=/d' "$profile"
  fi
  printf 'export PROXY_API_KEY="%s"\n' "$KEY" >> "$profile"
  echo "[OK] 已写入 $profile"
}
set_proxy_key_in_profile "$HOME/.zshrc"
set_proxy_key_in_profile "$HOME/.bash_profile"
set_proxy_key_in_profile "$HOME/.bashrc"

# 2b) 当前会话 GUI 应用（桌面 Codex）＋ 桌面版已知坑的兜底变量（名字=key值）
launchctl setenv PROXY_API_KEY "$KEY" 2>/dev/null
launchctl setenv "$KEY" "$KEY" 2>/dev/null
echo "[OK] launchctl setenv PROXY_API_KEY（当前会话 GUI 应用可读取）"

# 2c) LaunchAgent：重启后 GUI 应用仍能读取（等价 Windows 用户级环境变量）
LA="$HOME/Library/LaunchAgents"
mkdir -p "$LA"
LA_PLIST="$LA/com.copilot-ploxy.proxykey.plist"
cat > "$LA_PLIST" <<EOF
<?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.copilot-ploxy.proxykey</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/zsh</string>
    <string>-c</string>
    <string>launchctl setenv PROXY_API_KEY '$KEY'; launchctl setenv '$KEY' '$KEY'</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
EOF
launchctl unload "$LA_PLIST" 2>/dev/null || true
if launchctl load "$LA_PLIST" 2>/dev/null; then
  echo "[OK] 已安装 LaunchAgent（重启后 GUI 仍可读取 PROXY_API_KEY）"
else
  echo "[..] LaunchAgent 未加载（可忽略，当前会话已生效）"
fi

# ── 3) 备份并写入 config.toml ───────────────────────────────
mkdir -p "$CODEX_HOME"
CONFIG_CONTENT='model = "gpt-5.6-sol"
model_provider = "proxy"
approval_policy = "on-failure"
model_auto_compact_token_limit = 150000

# 远程压缩（平台已支持）：provider name 恰为 "OpenAI" 时 codex 启用远程压缩
# （POST /responses + compaction 加密块，2026-08-31 实测企业版与生产个人版均
# 接受 200）。压缩后上下文被摘要替代，请求体不再膨胀（根治上游 413）。
# model_auto_compact_token_limit=150000 显式触发自动压缩：任意 codex 版本
# 都会在上下文超 15 万 token 时压缩，不依赖客户端默认（旧版默认不压缩，
# 会话会膨胀到 33MB 级被上游 413）。
[model_providers.proxy]
name = "OpenAI"
base_url = "https://diracai-studio.com/v1"
wire_api = "responses"
env_key = "PROXY_API_KEY"
requires_openai_auth = false'

TARGET="$CODEX_HOME/config.toml"
if [ -f "$TARGET" ]; then
  BAK="$TARGET.bak-$(date +%Y%m%d-%H%M%S)"
  cp "$TARGET" "$BAK"
  echo "[OK] 已备份: $BAK"
else
  echo "[..] 无现有配置，跳过备份"
fi
printf '%s\n' "$CONFIG_CONTENT" > "$TARGET"
echo "[OK] 已写入配置: $TARGET"

# ── 4) 备份并写入 auth.json（跳过桌面端登录界面）───────────
# 值仅需非空 sk- 格式即可；实际认证走 PROXY_API_KEY + 代理，不经 OpenAI 校验。
AUTH_CONTENT='{
  "auth_mode": "apikey",
  "OPENAI_API_KEY": "sk-codex-proxy-placeholder-000000000000000000000000000000"
}'

AUTH_TARGET="$CODEX_HOME/auth.json"
if [ -f "$AUTH_TARGET" ]; then
  BAK="$AUTH_TARGET.bak-$(date +%Y%m%d-%H%M%S)"
  cp "$AUTH_TARGET" "$BAK"
  echo "[OK] 已备份: $BAK"
else
  echo "[..] 无现有 auth.json，跳过备份"
fi
printf '%s\n' "$AUTH_CONTENT" > "$AUTH_TARGET"
echo "[OK] 已写入 auth.json（apikey 模式，桌面端将跳过登录界面）"

# ── 5) 自动识别 codex CLI ───────────────────────────────────
CLI="$(command -v codex 2>/dev/null || true)"
if [ -z "$CLI" ]; then
  for p in "$HOME/.codex/bin/codex" "$HOME/.local/bin/codex" /opt/homebrew/bin/codex /usr/local/bin/codex; do
    if [ -x "$p" ]; then CLI="$p"; break; fi
  done
fi
if [ -n "$CLI" ]; then
  echo "[INFO] codex CLI: $CLI"
else
  echo "[..] 未找到 codex CLI（可忽略，桌面应用也能用）"
fi

echo ""
echo "完成！请完全退出并重新打开 Codex 桌面应用，然后发一条消息确认："
echo "  1) 完全退出 Codex（Cmd+Q）后重新打开"
echo "  2) 打开后应直接进入对话界面（不再要求登录）"
echo "  3) 在对话里发送任意消息（如：你好）"
echo "  4) 正常回复即配置成功（默认模型 gpt-5.6-sol）"
echo ""
read -r -p "按回车键关闭窗口" _
