/**
* アラート(事前チェック)の種別ラベルの組み立て(純粋関数)。
*
* ★固定ラベル(`precheck_1h` → 「1h前異常」)をやめた理由★(D-105 / D-093 項2):
* `clean_timetables.precheck` は ★設定値に応じた任意の分数★ を取りうる
* (ユーザー回答: 「20だったら20分前になります」)。分数ごとの enum も
* 分数ごとの固定ラベルも持てないので、`precheck_minutes`(数値)から組み立てる。
*
* ★画面(`components/features/alerts/AlertsScreen.tsx`)から切り出してある理由★:
* 「20分前異常」のような**設定値以外の分数**が本当にラベルになるかは
* 本指示書の完了条件(指示書S 完了条件7)であり、目視だけでは固定できない。
* 純粋関数にしてテストで固定する(`CLAUDE.md` §6-2)。
*/
import type { PrecheckItem } from "@/lib/types";
/** `useTheme()` が渡す翻訳関数と同じ形(`components/theme/ThemeProvider.tsx`) */
export type Translate = (text: string) => string;
/**
* `severity` と `precheck_minutes` から種別ラベルを作る。
*
* ★i18n は方式A(プレースホルダ + replace)★ — `lib/i18n.ts` はキーが日本語原文の
* 完全一致なので、数値が混ざる文言はそのままキーにできない。
* 前例は `"{n}分前"` / `"第{n}回チェック"`(同ファイル)。
*
* ★`severity: "precheck"` なのに `precheck_minutes` が `null`★ は、API契約では
* 起きない組み合わせ(`null` は `launch_failed` のときだけ)。それでも
* ★黙って空文字や `null分前異常` を出さず「事前チェック異常」に倒す★ —
* ラベルが壊れた理由に誰も気づけない状態を作らない(`MAKER_NAMES` /
* `ROBOT_MODELS` のコメントと同じ思想)。
*/
export function precheckSeverityLabel(
t: Translate,
item: Pick<PrecheckItem, "severity" | "precheck_minutes">
): string {
if (item.severity === "launch_failed") return t("出発失敗");
if (item.precheck_minutes === null) return t("事前チェック異常");
return t("{n}分前異常").replace("{n}", String(item.precheck_minutes));
}