/**
* エラー一覧(`/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));
}
}