/**
 * エラー一覧（`/errors`。指示書AW）の「紐づく予定」ラベルの組み立て（純粋関数）。
 *
 * ★画面から切り出してある理由★: 「事前チェック（10分前）」のような★設定値以外の分数★が本当にラベルになるかを、
 *   目視だけでなくテストで固定するため（`CLAUDE.md` §6-2。`lib/prechecks/label.ts` と同じ考え方）。
 *   テストは `lib/error-reports/__tests__/label.test.ts`（表3）。
 */
import type { Translate } from "@/lib/prechecks/label";
import type { ErrorReportItem } from "@/lib/types";

/**
 * `schedule_link` と `precheck_minutes` から「紐づく予定」のラベルを作る（指示書AW §3 表3）。
 *
 * | `schedule_link` / `precheck_minutes` | JP |
 * |---|---|
 * | `main` / null | 本清掃 |
 * | `precheck` / N | 事前チェック（N分前）（★N は生の分数★） |
 * | `none` / null | 予定なし |
 * | `unknown` / null | 予定不明 |
 * | `precheck` / ★null★（API 契約では起きない） | 事前チェック |
 *
 * ★i18n は方式A（プレースホルダ + replace）★ — `lib/i18n.ts` はキーが日本語原文の完全一致なので、
 *   数値が混ざる文言はそのままキーにできない（前例は `"{n}分前"` / `"{n}分前異常"`）。
 * ★`precheck` なのに分数が null★ は、黙って「null分前」を出さず「事前チェック」に倒す
 *   （`precheckSeverityLabel()` と同じ考え方。ラベルが壊れた理由に誰も気づけない状態を作らない）。
 */
export function errorScheduleLabel(
  t: Translate,
  item: Pick<ErrorReportItem, "schedule_link" | "precheck_minutes">
): string {
  switch (item.schedule_link) {
    case "main":
      return t("本清掃");
    case "none":
      return t("予定なし");
    case "unknown":
      return t("予定不明");
    case "precheck":
      if (item.precheck_minutes === null) return t("事前チェック");
      return t("事前チェック（{n}分前）").replace("{n}", String(item.precheck_minutes));
  }
}
