/**
 * arcrun_whoami — MCP 端的「我現在是誰、連哪台」（§7.8 P1 D2，與 CLI acr whoami 對齊）。
 *
 * D2 根因（self-hosted-init.md §7.8）：AI 不用工具讀帳號、自己 curl 猜全域 → 打錯帳號。
 * 治本是給 AI 無腦入口：問工具拿身份。CLI 有 acr whoami，MCP 必須對齊（薄殼一致，rule 07 §5）——
 * 否則「AI 偏好 MCP」時又得繞回 curl。
 *
 * 2026-08-12 改：以帳密連線時，「我是誰」的答案是**登入的那個人**（display_name / role /
 * 可用知識庫），不是一個租戶代號。原本回的 account_namespace 是租戶字串——那東西一旦落到
 * 呼叫端手上就能拿去直打 /kbdb/*、繞過所有庫過濾（portal-data.ts 檔頭紅線），所以登入身分下
 * 不再回它。工作流面（arcrun_*）仍用它當 API key，但那只在 server 內部用。
 *
 * 薄殼：只如實回報 MCP 已解析的身分，不做推斷、不打任何查詢。
 */
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { toolName } from "../brand.js";
import { Env } from "../types.js";
import type { KnowledgeIdentity } from "../lib/portal-client.js";

export function registerWhoami(
  server: McpServer,
  env: Env,
  orgNamespace: string,
  identity: KnowledgeIdentity,
) {
  server.tool(
    toolName("whoami"),
    "回報這個 MCP 連線目前生效的身份：以帳密連線時回「登入的是誰、能看哪些知識庫」；" +
      "服務級 token 連線時回綁定的帳號 namespace。部署 / 觸發 / 查 workflow 前先 call 此 tool 確認身份，" +
      "**不要自己 curl 猜帳號 URL**（會打到錯帳號）。",
    {},
    async () => {
      const base = {
        cypher: "service-binding:CYPHER_EXECUTOR",
        kbdb: "service-binding:KBDB",
      };

      if (identity.kind === "portal") {
        const { display_name, role, libraries } = identity.portal;
        return json({
          ...base,
          auth: "portal-login（這條連線是有人輸入 Portal 帳密授權的）",
          logged_in_as: display_name || "(未設顯示名稱)",
          role,
          libraries: libraries.length ? libraries : ["(尚未被授權任何知識庫)"],
          knowledge_scope:
            libraries.includes("*")
              ? "全部知識庫（此帳號有全庫權限）"
              : `僅限上列知識庫——kbdb_* 查得到的東西與這個帳號在 portal 網頁上看得到的完全一致`,
          note:
            "你是「主人授權的 AI」：主人查得到的你查得到，主人查不到的你也查不到。" +
            "kbdb_* 不需要任何額外的 credential / 金鑰 / kbdb_base——已經登入過了，不會再問第二次。",
        });
      }

      if (identity.kind === "stale") {
        return json({
          ...base,
          auth: "舊版 token（沒有登入者身分）",
          knowledge_scope: "查不到任何知識內容",
          note:
            "這條連線是本次改版前簽發的 token。到 claude.ai → Settings → Connectors " +
            "重新連線一次（輸入 Portal 帳密）即可恢復，不需要找任何 credential。",
        });
      }

      return json({
        ...base,
        auth: "service token（static token / partner key，代表整個實例或租戶，不是某個人）",
        account_namespace: orgNamespace || "(未設)",
        note: "此 MCP 已綁定上述帳號。部署/觸發/查詢都走這個身份；勿自行 curl 其他 URL 猜帳號。",
      });
    },
  );
}

function json(obj: unknown) {
  return { content: [{ type: "text" as const, text: JSON.stringify(obj, null, 2) }] };
}
