/**
 * エラー一覧の「詳細」の列に出すエラー内容（指示書BE §3。D-185。2026-10-27 に「種類」セルの2行目から独立した列へ移した。§12）。
 *
 * ★分類名・詳細は `t()` に通さない★ — 辞書に同じ綴りがあると誤訳される。
 * 日英は `lang` で `_ja` / `_en` を出し分ける。
 * 「未選択」「不明({id})」「選択」だけは画面側が `t()` に通す（この関数は kind を返す）。
 */
import type { Lang } from "@/lib/i18n";
import type { ErrorListItem } from "@/lib/types";

export type ErrorContentView =
  | { kind: "dash" }
  | { kind: "unselected" }
  | { kind: "unknown"; id: number }
  | { kind: "category"; text: string; title: string }
  | { kind: "detail"; text: string; title: string };

function categoryTitle(lang: Lang, item: ErrorListItem): string {
  const main = lang === "ja" ? item.error_category_main_ja : item.error_category_main_en;
  const sub = lang === "ja" ? item.error_category_sub_ja : item.error_category_sub_en;
  return `${main} / ${sub}`;
}

/** 解決済みの1件から、セルに出す文字を決める（選べない行・未選択・不明は呼び出し側） */
export function errorContentViewFromItem(lang: Lang, item: ErrorListItem): ErrorContentView {
  const title = categoryTitle(lang, item);
  if (item.note_required) {
    const text = lang === "ja" ? item.error_category_main_ja : item.error_category_main_en;
    return { kind: "category", text, title };
  }
  const text = lang === "ja" ? item.error_detail_ja : item.error_detail_en;
  return { kind: "detail", text, title: `${title} / ${text}` };
}

/**
 * 行（下書き優先）の「詳細」の列の中身。
 * `draftId === undefined` は「エラー内容の下書きが無い」（保存済みを見る）。
 * 下書きの id は選択肢（`catalog`）から引く。選択肢に無ければ「不明」。
 */
export function errorContentView(input: {
  lang: Lang;
  selectable: boolean;
  savedId: number | null;
  savedList: ErrorListItem | null;
  draftId: number | undefined;
  catalog: readonly ErrorListItem[];
}): ErrorContentView {
  if (!input.selectable) return { kind: "dash" };
  const id = input.draftId !== undefined ? input.draftId : input.savedId;
  if (id === null) return { kind: "unselected" };
  const list =
    input.draftId !== undefined
      ? (input.catalog.find((item) => item.id === id) ?? null)
      : input.savedList?.id === id
        ? input.savedList
        : (input.catalog.find((item) => item.id === id) ?? null);
  if (!list) return { kind: "unknown", id };
  return errorContentViewFromItem(input.lang, list);
}
