#!/usr/bin/env bash
# ============================================================
#  Router One · Claude Code 一键接入 / one-click setup
#  Docs: https://router.one/docs/guides/cli-setup
#
#  用法 / Usage:
#    curl -fsSL https://router.one/install/claude-code.sh | bash -s -- sk-your-api-key
#
#  做三件事 / What it does:
#    1. 安装 Claude Code（npm 或官方安装器，如未安装）
#    2. 把网关地址和 Key 写入 ~/.claude/settings.json 的 env 块
#    3. 发送 1 token 测试请求验证连通
# ============================================================

if [ -t 1 ] && [ -z "$NO_COLOR" ]; then
  C_OK="$(printf '\033[32m')"
  C_WARN="$(printf '\033[33m')"
  C_ERR="$(printf '\033[31m')"
  C_DIM="$(printf '\033[2m')"
  C_OFF="$(printf '\033[0m')"
else
  C_OK=""; C_WARN=""; C_ERR=""; C_DIM=""; C_OFF=""
fi
ok()   { printf '%s[OK]%s %s\n' "$C_OK" "$C_OFF" "$1"; }
warn() { printf '%s[!]%s %s\n' "$C_WARN" "$C_OFF" "$1"; }
err()  { printf '%s[X]%s %s\n' "$C_ERR" "$C_OFF" "$1" >&2; }
info() { printf '%s>%s %s\n' "$C_DIM" "$C_OFF" "$1"; }

printf '\n%s\n\n' "Router One · Claude Code 一键接入"

API_KEY="$1"
if [ -z "$API_KEY" ]; then API_KEY="$ROUTER_ONE_API_KEY"; fi
if [ -z "$API_KEY" ] && [ -e /dev/tty ]; then
  printf '请输入你的 Router One API Key / Enter your API key (sk-...): ' > /dev/tty
  IFS= read -r API_KEY < /dev/tty || API_KEY=""
fi
if [ -z "$API_KEY" ]; then
  err "缺少 API Key / missing API key"
  info "用法 / usage: curl -fsSL https://router.one/install/claude-code.sh | bash -s -- sk-your-api-key"
  info "先在 https://router.one/dashboard/api-keys 创建 API Key"
  exit 1
fi
if [ "$API_KEY" = "sk-your-api-key" ]; then
  err "请把 sk-your-api-key 替换成你的真实 API Key / replace the placeholder with your real key"
  info "在 https://router.one/dashboard/api-keys 创建后复制完整的 sk- 开头密钥"
  exit 1
fi
case "$API_KEY" in
  sk-*) : ;;
  *) warn "API Key 一般以 sk- 开头，请确认复制完整 / keys usually start with sk-" ;;
esac

# ---- 1. Claude Code CLI ------------------------------------
if command -v claude >/dev/null 2>&1; then
  ok "检测到 Claude Code / found Claude Code: $(command -v claude)"
else
  if command -v npm >/dev/null 2>&1; then
    info "未检测到 Claude Code，通过 npm 安装 / installing @anthropic-ai/claude-code via npm..."
    npm install -g @anthropic-ai/claude-code
  fi
  if ! command -v claude >/dev/null 2>&1; then
    info "通过官方安装器安装（无需 Node.js）/ installing via the official installer..."
    if curl -fsSL https://claude.ai/install.sh | bash; then
      export PATH="$HOME/.local/bin:$PATH"
    else
      warn "官方安装器执行失败 / official installer failed"
    fi
  fi
  if command -v claude >/dev/null 2>&1; then
    ok "Claude Code 安装完成 / installed"
  else
    warn "未能确认 claude 命令可用：安装可能未完成，或需重开终端后生效 / could not confirm claude on PATH — reopen your terminal if needed"
  fi
fi

# ---- 2. ~/.claude/settings.json ----------------------------
CLAUDE_DIR="$HOME/.claude"
SETTINGS_FILE="$CLAUDE_DIR/settings.json"
mkdir -p "$CLAUDE_DIR"
if [ -f "$SETTINGS_FILE" ]; then
  BACKUP_FILE="$SETTINGS_FILE.bak.$(date +%Y%m%d%H%M%S)"
  cp "$SETTINGS_FILE" "$BACKUP_FILE"
  info "已备份原配置 / backed up existing settings: $BACKUP_FILE"
fi

write_settings_fresh() {
  cat > "$SETTINGS_FILE" <<EOF
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.router.one",
    "ANTHROPIC_AUTH_TOKEN": "$API_KEY"
  }
}
EOF
}

if command -v node >/dev/null 2>&1; then
  SETTINGS_FILE="$SETTINGS_FILE" ROUTER_ONE_BASE="https://api.router.one" ROUTER_ONE_KEY="$API_KEY" node <<'EOF'
const fs = require("fs");
const file = process.env.SETTINGS_FILE;
let config = {};
try {
  config = JSON.parse(fs.readFileSync(file, "utf8"));
} catch (error) {
  config = {};
}
config.env = Object.assign({}, config.env, {
  ANTHROPIC_BASE_URL: process.env.ROUTER_ONE_BASE,
  ANTHROPIC_AUTH_TOKEN: process.env.ROUTER_ONE_KEY,
});
fs.writeFileSync(file, JSON.stringify(config, null, 2) + "\n");
EOF
elif command -v python3 >/dev/null 2>&1; then
  SETTINGS_FILE="$SETTINGS_FILE" ROUTER_ONE_BASE="https://api.router.one" ROUTER_ONE_KEY="$API_KEY" python3 <<'EOF'
import json, os
file = os.environ["SETTINGS_FILE"]
try:
    with open(file) as f:
        config = json.load(f)
except Exception:
    config = {}
if not isinstance(config, dict):
    config = {}
env = config.get("env")
if not isinstance(env, dict):
    env = {}
env["ANTHROPIC_BASE_URL"] = os.environ["ROUTER_ONE_BASE"]
env["ANTHROPIC_AUTH_TOKEN"] = os.environ["ROUTER_ONE_KEY"]
config["env"] = env
with open(file, "w") as f:
    json.dump(config, f, indent=2, ensure_ascii=False)
    f.write("\n")
EOF
else
  if [ -f "$SETTINGS_FILE" ]; then
    warn "未找到 node/python3，无法合并已有配置，将直接覆盖（原文件已备份）/ overwriting settings (backup kept)"
  fi
  write_settings_fresh
fi
ok "已写入 $SETTINGS_FILE (ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN)"

if [ -n "$ANTHROPIC_BASE_URL" ] && [ "$ANTHROPIC_BASE_URL" != "https://api.router.one" ]; then
  warn "当前 shell 存在 ANTHROPIC_BASE_URL=$ANTHROPIC_BASE_URL 的旧 export。settings.json 的 env 会覆盖它，但建议从 shell 配置里清理。"
fi

# ---- 3. Verify ---------------------------------------------
info "发送一次 1 token 测试请求验证网关连通 / verifying gateway with a 1-token request..."
HTTP_STATUS="$(curl -s -o /dev/null -w '%{http_code}' --max-time 60 \
  -X POST "https://api.router.one/v1/chat/completions" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"auto","max_tokens":1,"messages":[{"role":"user","content":"ping"}]}')" || HTTP_STATUS="000"
FAILED=0
case "$HTTP_STATUS" in
  200) ok "网关连通，API Key 有效 / gateway reachable, key valid" ;;
  401)
    err "API Key 无效 (401)。配置已写入，但请到 https://router.one/dashboard/api-keys 检查或重新生成 Key。"
    FAILED=1
    ;;
  402) warn "API Key 有效但余额不足 (402)。请先充值 / top up first: https://router.one/dashboard" ;;
  000) warn "网络请求失败，跳过验证（配置已写入）/ network error, skipped verification" ;;
  *) warn "验证请求返回 HTTP $HTTP_STATUS (配置已写入)。排查见 / troubleshooting: https://router.one/docs/guides/cli-setup" ;;
esac

printf '\n'
if [ "$FAILED" = "1" ]; then
  err "配置完成，但 API Key 验证未通过 / setup finished but key verification failed"
  exit 1
fi
ok "全部完成！运行 claude 开始使用 / all set — run: claude"
info "文档 / docs: https://router.one/docs/guides/cli-setup"
