Newer
Older
client_dwatch / lib / prechecks / label.ts
/**
 * アラート(事前チェック)の種別ラベルの組み立て(純粋関数)。
 *
 * ★固定ラベル(`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));
}