/**
 * Built-in TUI slash commands that pi only handles in interactive mode.
 * Via AgentSession.prompt() they would be sent as plain user text — web must
 * intercept these and map them to UI / RPC actions.
 *
 * Extension / skill / prompt-template commands are NOT listed here; they go
 * through prompt() so pi can expand/execute them.
 */

export type BuiltinWebAction =
  | "openModel"
  | "openThinking"
  | "openTools"
  | "runCompact"
  | "openBranches"
  | "runClone"
  | "hintFork"
  | "setName"
  | "newSession"
  | "resumeSession"
  | "openTrust"
  | "openSessionInfo"
  | "triggerExport"
  | "copyLast"
  | "reloadResources"
  | "openLogin"
  | "openLogout"
  | "openSettings"
  | "showHotkeys"
  | "noopQuit"
  | "showChangelog"
  | "scopedModels"
  | "share"
  | "importSession"
  | "unsupported";

export interface BuiltinSlashCommand {
  name: string;
  description: string;
  webAction: BuiltinWebAction;
  /** If true, trailing args are meaningful (e.g. /compact focus on API, /name foo) */
  acceptsArgs?: boolean;
}

export const BUILTIN_SLASH_COMMANDS: BuiltinSlashCommand[] = [
  { name: "model", description: "选择模型", webAction: "openModel" },
  { name: "settings", description: "打开设置", webAction: "openSettings" },
  { name: "scoped-models", description: "配置快捷切换模型列表", webAction: "scopedModels" },
  { name: "export", description: "导出会话", webAction: "triggerExport" },
  { name: "import", description: "导入会话", webAction: "importSession" },
  { name: "share", description: "分享会话（Gist）", webAction: "share" },
  { name: "copy", description: "复制上一条助手回复", webAction: "copyLast" },
  { name: "name", description: "设置会话名称", webAction: "setName", acceptsArgs: true },
  { name: "session", description: "会话信息与用量", webAction: "openSessionInfo" },
  { name: "changelog", description: "版本更新说明", webAction: "showChangelog" },
  { name: "hotkeys", description: "快捷键说明", webAction: "showHotkeys" },
  { name: "fork", description: "从某条用户消息分叉新会话", webAction: "hintFork" },
  { name: "clone", description: "复制当前分支到新会话", webAction: "runClone" },
  { name: "tree", description: "浏览/切换会话分支", webAction: "openBranches" },
  { name: "trust", description: "项目信任设置", webAction: "openTrust" },
  { name: "login", description: "登录 / 配置认证", webAction: "openLogin" },
  { name: "logout", description: "登出", webAction: "openLogout" },
  { name: "new", description: "新建会话", webAction: "newSession" },
  { name: "compact", description: "压缩上下文", webAction: "runCompact", acceptsArgs: true },
  { name: "resume", description: "恢复其他会话", webAction: "resumeSession" },
  { name: "reload", description: "重载 skills / prompts / extensions", webAction: "reloadResources" },
  { name: "quit", description: "退出（Web 中无效）", webAction: "noopQuit" },
  // pi-mcp-adapter TUI panels — must not go through prompt() (no agent_end → sticky running state)
  { name: "mcp", description: "MCP 状态面板（仅终端 TUI）", webAction: "unsupported" },
  { name: "mcp-auth", description: "MCP OAuth 认证（仅终端 TUI）", webAction: "unsupported" },
];

const BY_NAME = new Map(BUILTIN_SLASH_COMMANDS.map((c) => [c.name.toLowerCase(), c]));

/** Resolve a slash name (without leading /) to a builtin command, if any. */
export function getBuiltinSlashCommand(name: string): BuiltinSlashCommand | undefined {
  // skill:foo is never builtin
  if (name.includes(":")) return undefined;
  return BY_NAME.get(name.toLowerCase());
}

/** SlashCommandItem-compatible entries for the autocomplete dropdown. */
export function getBuiltinSlashItems(): Array<{
  name: string;
  description: string;
  category: "builtin";
  sourceLabel: string;
}> {
  return BUILTIN_SLASH_COMMANDS.map((c) => ({
    name: c.name,
    description: c.description,
    category: "builtin" as const,
    sourceLabel: "builtin",
  }));
}
