/**
 * toolPolicy.ts — ツールポリシー UI 用の純関数ユーティリティ
 *
 * DOM に依存しないため node 環境でテスト可能。
 */

import type { ToolCategory } from '../api';

/** カテゴリ配列を safe / sensitive の 2 グループに分割する。 */
export function splitCategories(categories: ToolCategory[]): {
  safe: ToolCategory[];
  sensitive: ToolCategory[];
} {
  return {
    safe: categories.filter(c => !c.sensitive),
    sensitive: categories.filter(c => c.sensitive),
  };
}

/**
 * 現在の policy 状態から PUT body を計算する。
 *
 * @param categories API から取得したカテゴリ一覧
 * @param toggledSafe  safe カテゴリのうち、UI でトグルされた状態（name → enabled）
 * @param toggledSens  sensitive カテゴリ・ツールのうち、UI でトグルされた状態（name → enabled）
 * @param sensitiveTools  Bash 等の個別センシティブツール（categories とは別配信）。
 *   これを渡さないとトグル ON が enabledSensitive に載らず保存が落ちる。
 *   `toggledSens` はカテゴリとツールを同じマップで共有する（name キー）。
 */
export function buildPolicyPatch(
  categories: ToolCategory[],
  toggledSafe: Record<string, boolean>,
  toggledSens: Record<string, boolean>,
  sensitiveTools: { name: string; enabled: boolean }[] = [],
): { disabledSafe: string[]; enabledSensitive: string[] } {
  const isOn = (name: string, apiEnabled: boolean) => {
    const overridden = Object.prototype.hasOwnProperty.call(toggledSens, name);
    return overridden ? toggledSens[name] : apiEnabled;
  };

  const disabledSafe = categories
    .filter(c => !c.sensitive)
    .filter(c => {
      const overridden = Object.prototype.hasOwnProperty.call(toggledSafe, c.name);
      return overridden ? !toggledSafe[c.name] : !c.enabled;
    })
    .map(c => c.name);

  // センシティブカテゴリ（ssh / browser）＋個別センシティブツール（Bash）を
  // 同じ enabledSensitive 配列に合流する。サーバ側 allowlist は両方を受理する。
  const enabledSensitive = [
    ...categories.filter(c => c.sensitive && isOn(c.name, c.enabled)).map(c => c.name),
    ...sensitiveTools.filter(t => isOn(t.name, t.enabled)).map(t => t.name),
  ];

  return { disabledSafe, enabledSensitive: [...new Set(enabledSensitive)] };
}

/** 有効なカテゴリ数を数える（サマリ表示用）。 */
export function countEnabledCategories(
  categories: ToolCategory[],
  toggledSafe: Record<string, boolean>,
  toggledSens: Record<string, boolean>,
): number {
  return categories.filter(c => {
    const map = c.sensitive ? toggledSens : toggledSafe;
    const overridden = Object.prototype.hasOwnProperty.call(map, c.name);
    return overridden ? map[c.name] : c.enabled;
  }).length;
}
