/**
 * 公開範囲（private / org / public）を選んだとき、実際に「何が・誰に」共有されるかを
 * 正確に説明するためのデータ。バックエンドの実挙動（buildVisibilityWhere / canViewTask /
 * local-files-api / Space-as-Principal のメモリ隔離）と一致させること。
 *
 * 重要な真実:
 * - タスク詳細・ファイル・サブタスクは可視性スコープに従って共有される。
 * - AGENTS.md / メモリ / カレンダーは可視性設定では共有されない（スペースのメンバーシップに従う別系統）。
 * - 閲覧者は読み取り専用。実行・Continue・編集はオーナーのみ。
 * - public は「ログイン済みの全ユーザー」。未ログインには非公開。
 */
export type VisibilityScope = 'private' | 'org' | 'public';

export interface SharingItem {
  label: string;
  /** この可視性設定で共有されるか。 */
  shared: boolean;
}

export interface SharingPreview {
  /** 誰がアクセスできるか（一文）。 */
  audience: string;
  /** 閲覧者の権限についての注記。 */
  accessNote: string;
  /** 共有される / されない項目の一覧。 */
  items: SharingItem[];
}

export function sharingPreview(scope: VisibilityScope, orgName?: string | null): SharingPreview {
  const audience =
    scope === 'private'
      ? 'あなたのみがアクセスできます'
      : scope === 'org'
        ? `${orgName ?? 'この組織'}のメンバーが閲覧できます`
        : 'ログイン済みの全ユーザーが閲覧できます（未ログインには非公開）';

  const accessNote =
    scope === 'private'
      ? '他の人には表示されません'
      : '閲覧者は読み取り専用です（編集・実行・Continue はできません）';

  // 「自分だけ」では何も共有されない。org / public で初めて共有される項目がある。
  // AGENTS.md / メモリ / カレンダーは、どのスコープでも可視性設定では共有されない。
  const taskShared = scope !== 'private';
  const items: SharingItem[] = [
    { label: 'タスクの詳細・コメント', shared: taskShared },
    { label: 'ファイル（input / output）', shared: taskShared },
    { label: 'サブタスク', shared: taskShared },
    { label: 'AGENTS.md・メモリ', shared: false },
    { label: 'カレンダー', shared: false },
  ];

  return { audience, accessNote, items };
}

/** 各スコープの 1 行ツールチップ（ラジオのホバー説明）。 */
export function visibilityTooltip(scope: VisibilityScope): string {
  switch (scope) {
    case 'private':
      return 'あなたのみがアクセスできます';
    case 'org':
      return '選んだ組織のメンバーが、このタスクとファイルを閲覧できます（編集・実行は不可）';
    case 'public':
      return 'ログイン済みの全ユーザーが閲覧できます（未ログインには非公開）';
  }
}
