// 首次授权弹窗（§1.3.2）：每个 capability 首次调用必须用户明示 allow / deny。
// 授权结果 in-memory 缓存（per session）；持久化 + per-tool 细粒度授权放 PR12 后续 PR。

import { BrowserWindow, dialog } from "electron";
import type { HostCapability } from "@ffai/agent-protocol";
import { t } from "../i18n";

const granted = new Set<HostCapability>();
const denied = new Set<HostCapability>();

/**
 * 检查能力是否已授权；首次调用弹 OS 级对话框等用户决策。
 * 返回 true=已授权 / false=用户拒绝（拒后整 session 静默拒，不重复弹）。
 */
export async function ensureCapabilityGranted(
  cap: HostCapability,
  context?: { tool?: string; argsSummary?: string },
): Promise<boolean> {
  if (granted.has(cap)) return true;
  if (denied.has(cap)) return false;

  const parent = BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0];
  const detail = [
    context?.tool ? `${t("permission.tool")}: ${context.tool}` : null,
    context?.argsSummary ? `${t("permission.args")}: ${context.argsSummary}` : null,
  ]
    .filter(Boolean)
    .join("\n");

  const opts: Electron.MessageBoxOptions = {
    type: "question",
    buttons: [t("permission.allow"), t("permission.deny")],
    defaultId: 1,
    cancelId: 1,
    title: t("permission.title"),
    message: t(`permission.capability.${cap}`),
    detail: detail || undefined,
    noLink: true,
  };
  // Electron 的 showMessageBox 有两个 overload：带 parent 是 modal、不带是非 modal
  const res = parent ? await dialog.showMessageBox(parent, opts) : await dialog.showMessageBox(opts);

  if (res.response === 0) {
    granted.add(cap);
    return true;
  }
  denied.add(cap);
  return false;
}

/** 测试 / admin 后台用：重置授权状态 */
export function resetPermissions(): void {
  granted.clear();
  denied.clear();
}
