/**
 * アラート（事前チェック）の種別ラベルの組み立て（純粋関数）。
 *
 * ★固定ラベル（`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));
}
