/**
 * acr mcp-setup — 在目前資料夾寫 / 更新 .mcp.json，讓 Claude Code 連對的 arcrun MCP。
 *
 * 薄殼原則（rule 07 + SDD mcp-account-source.md）：
 *   MCP URL 與 cypher URL 一樣，由同一份三層 config 解析（env > 專案 .arcrun.yaml > 全域）決定。
 *   「切換帳號」= 在客戶資料夾跑 acr mcp-setup（讀該資料夾的 .arcrun.yaml）→ 產指向客戶 MCP 的 .mcp.json。
 *   進哪個專案資料夾 → Claude Code 讀該專案 .mcp.json → 連對應 MCP（綁該帳號的 cypher）。
 *
 * 不重實作身份解析：呼叫 config.ts 的 getMcpUrl()（唯一解析來源）。
 */

import chalk from 'chalk';
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
import { join } from 'node:path';
import { loadConfig, getMcpUrl, DEFAULT_MCP_URL } from '../lib/config.js';

/** Claude Code .mcp.json 的 server 條目（remote HTTP MCP）。 */
interface McpServerEntry {
  type: 'http';
  url: string;
  headers?: Record<string, string>;
}
interface McpJson {
  mcpServers?: Record<string, McpServerEntry | Record<string, unknown>>;
  [k: string]: unknown;
}

const SERVER_KEY = 'arcrun';

export function cmdMcpSetup(): void {
  const config = loadConfig();
  const mcpUrl = getMcpUrl(config);

  const target = join(process.cwd(), '.mcp.json');

  // 讀既有 .mcp.json（保留其他 MCP server 條目，只覆寫 arcrun 這條）
  let doc: McpJson = {};
  if (existsSync(target)) {
    try {
      doc = JSON.parse(readFileSync(target, 'utf8')) as McpJson;
    } catch {
      console.log(chalk.yellow(`  ⚠ 既有 .mcp.json 解析失敗，將以新內容覆寫整檔。`));
      doc = {};
    }
  }

  // 身份寫進 .mcp.json headers（HANDOFF §3b ②）：裸 .mcp.json 不送任何 header，
  // MCP partner-auth 收不到 token → 一律 401。與 CLI 同一份身份來源（rule 07 §4）：
  //   self-hosted → api_key 欄位存的是 namespace 明碼（config.ts NAMESPACE→api_key），
  //     MCP（MULTI_TENANT=false）把 Bearer 當 org_namespace，與 cypher 的 X-Arcrun-API-Key 對齊。
  //   standard → api_key 是平台 ak_（多租戶 MCP 仍走 partner 驗證；ak_ 不是 pk_live 的話平台側自理）。
  // 不重實作身份解析：直接用 loadConfig() 已解析好的 api_key（薄殼只暴露，不自造邏輯）。
  const identity = config.api_key && config.api_key.trim() !== '' ? config.api_key.trim() : undefined;
  const entry: McpServerEntry = { type: 'http', url: mcpUrl };
  if (identity) entry.headers = { Authorization: `Bearer ${identity}` };

  if (!doc.mcpServers || typeof doc.mcpServers !== 'object') doc.mcpServers = {};
  doc.mcpServers[SERVER_KEY] = entry;

  writeFileSync(target, JSON.stringify(doc, null, 2) + '\n', 'utf8');

  console.log(chalk.green(`\n  ✓ 已寫入 ${target}`));
  console.log(chalk.gray(`    arcrun MCP → ${mcpUrl}`));
  if (identity) {
    console.log(chalk.gray(`    身份 → Authorization: Bearer ${identity.slice(0, 6)}…（${config.mode === 'self-hosted' ? 'self-hosted namespace 明碼' : 'api_key'}）`));
  } else {
    console.log(chalk.yellow(`    ⚠ config 無 api_key/namespace → .mcp.json 不帶身份；self-hosted MCP 會 401。先 acr init 或設 NAMESPACE 再重跑。`));
  }
  if (mcpUrl === DEFAULT_MCP_URL && (!config.mcp_url || config.mcp_url.trim() === '')) {
    console.log(chalk.gray(`    （用平台預設；要連自己/客戶的 MCP，在 config 設 mcp_url 或 ARCRUN_MCP_URL env，再重跑）`));
  }
  console.log(chalk.gray(`    Claude Code 進此資料夾會自動連這台 MCP。切帳號 = 在對應資料夾重跑 acr mcp-setup。`));
  // §7.8 P2 D3：project scope MCP 寫進 .mcp.json 後**不會即時生效**，要重啟 IDE/client 才載入。
  // 不提示 → 用戶開了 MCP 工具卻發現用不了，以為壞了（D3 撞牆）。明說「請重啟」引導，不讓人誤判。
  console.log(chalk.yellow(`\n  ⚠ 請重啟 IDE / Claude Code client，project scope MCP 才會載入生效。`));
  console.log(chalk.gray(`    （重啟後若仍未出現 arcrun 工具，確認該 client 已「信任此工作區」。）\n`));
}
