import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { Env } from "../types.js";
import { registerSearchComponents } from "./arcrun_search_components.js";
import { registerSearchWorkflows } from "./arcrun_search_workflows.js";
import { registerListComponents } from "./arcrun_list_components.js";
import { registerGetComponent } from "./arcrun_get_component.js";
import { registerGetComponentGuide } from "./arcrun_get_component_guide.js";
import { registerCreateTag } from "./arcrun_create_tag.js";
import { registerListTags } from "./arcrun_list_tags.js";
import { registerDeleteTag } from "./arcrun_delete_tag.js";
import { registerTagResource } from "./arcrun_tag_resource.js";
import { registerUntagResource } from "./arcrun_untag_resource.js";
import { registerGetGuiContext } from "./arcrun_get_gui_context.js";
import { registerReportFeedback } from "./arcrun_report_feedback.js";
import { registerAllIntrospectionTools } from "./arcrun_introspection.js";
import { registerAllWorkflowCrudTools } from "./arcrun_workflow_crud.js";
import { registerAllSkillExampleTools } from "./arcrun_skills_examples.js";
import { registerAllRecipeTools } from "./arcrun_recipe.js";
import { registerAllKbdbDataTools } from "./kbdb_data.js";
import { registerAllKbdbGraphTools } from "./kbdb_graph.js";
import { registerAllKbdbMapTools } from "./kbdb_map.js";
import { registerWhoami } from "./arcrun_whoami.js";
import type { KnowledgeIdentity } from "../lib/portal-client.js";

export function registerAllTools(
  server: McpServer,
  env: Env,
  orgNamespace: string,
  partnerToken: string,
  identity: KnowledgeIdentity,
) {
  registerSearchComponents(server, env, orgNamespace);
  // 🔴 2026-07-21 leo 拍板停用：零件走 PR、專業等級；recipe/workflow/app 誰都可以做。
  // 零件貢獻**只有一條路＝PR 人審**（leo 2026-08-01：「已經沒有 publish 了，
  // 零件等級一律走 PR，這條路封了」；Arcrun#23 已關）。實作路徑已 git rm
  // （arcrun_publish_component.ts），不留死代碼當錯誤環境信號。
  // 想貢獻零件 → repo `Leo/arcrun-components` fork→PR→人審，見 CONTRIBUTING-components.md。
  registerSearchWorkflows(server, env, orgNamespace, partnerToken);  // workflow-discovery R2
  registerListComponents(server, env, orgNamespace);
  registerGetComponent(server, env, orgNamespace);
  // registerGetComponentGuide(server, env, orgNamespace);  // 同上，2026-07-21 停用
  registerCreateTag(server, env, orgNamespace);
  registerListTags(server, env, orgNamespace);
  registerDeleteTag(server, env, orgNamespace);
  registerTagResource(server, env, orgNamespace);
  registerUntagResource(server, env, orgNamespace);
  registerGetGuiContext(server, env, orgNamespace);
  // LI SDD M1.3: explicit feedback tool（arcrun_* 命名規範）
  registerReportFeedback(server, env, orgNamespace);
  // LI SDD M2.2: introspection tools (validate / paused / trace / recent executions)
  registerAllIntrospectionTools(server, env);
  // LI SDD M2.2: workflow CRUD (push / list / get / delete / run)
  // 取代早期壞掉的 deploy_workflow（打不存在的 /workflows/deploy endpoint），
  // 以及重複的 list/get workflow（改直問 cypher-executor 真實狀態，不從 KBDB 撈 metadata）。
  registerAllWorkflowCrudTools(server, env);
  // LI SDD M3.2: skills + examples lookup（KBDB-backed）
  // 走 sync-registry-to-kbdb.py 把 registry/{skills,examples} 同步進 KBDB
  // 2026-08-13：吃 identity 只為了「把話講對」——舊 token 誠實回 identity_missing，
  // 且 401 時能告訴登入者「是這批工具還走服務憑據，不是你的帳號讀不到」。
  // ⚠️ 這批**尚未**改走 portal 資料面（portal 沒有 by-entry_type 的 listing 端點；
  //    要接得補 API，不是在這層拼裝——rule 07 §3.1）。見該檔檔頭。
  registerAllSkillExampleTools(server, env, identity);
  // kbdb-base §7.5.i: recipe 公庫/私庫工具（與 CLI 六能力對齊，rule 07 §5 MCP 不落後）
  registerAllRecipeTools(server, env);
  // kbdb-base Phase 9.1: KBDB 資料層薄殼（template/record/query/search，HANDOFF §2）
  // 鐵律：不提供建表/SQL tool，AI 只有 template+slot 可用（類 Supabase 萬用表）
  // 2026-08-12：知識面（kbdb_*）全部改吃 identity——以帳密連線者走 portal 資料面
  // （權限＝那個人的權限），服務級憑據維持既有 KBDB 直連。見 lib/portal-client.ts。
  registerAllKbdbDataTools(server, env, identity);
  // issue #68: KBDB graph 查詢薄殼（kbdb_graph_neighbors，調 /q/:ns/graph_neighbors 同步查詢端點）
  // 補齊 D17「KBDB MCP＝RAG 套餐」第三模式：關鍵字/語義之外的圖（關係遍歷）
  registerAllKbdbGraphTools(server, env, orgNamespace, identity);
  // library-map SDD M4（Arcrun#39）: 藏書地圖薄殼（kbdb_get_map，調 kbdb GET /map／/map/:library）
  // retrieval 第一站：先看地圖定位庫，再 search/graph 進庫（design §6）
  registerAllKbdbMapTools(server, env, identity);
  // §7.8 P1 D2: whoami（與 CLI acr whoami 對齊，AI 不繞 CLI 自己 curl 猜帳號）
  registerWhoami(server, env, orgNamespace, identity);
}
