/**
 * アラート種別ラベルの期待値表（指示書S 2-2 / 完了条件7 / D-105）
 *
 * ★fixtures の実データを通す★ — 「`precheck_minutes: 20` の行が『20分前異常』と
 *   表示されること」は本指示書の完了条件（指示書S 完了条件7）。
 *   目視だけで済ませないため、ここで固定する（`CLAUDE.md` §6-2）。
 * ★JA / EN の両方を見る★ — 従来 `lib/i18n.ts` にキーが無く EN でも日本語のまま出ていた
 *   （D-093 項2-3 の指摘）。対訳を入れたことを固定する。
 * ★アラートは事前チェック異常だけ★（ユーザー判断 2026-10-29）— 旧「出発失敗」「事前チェック異常」（分数 null の退避）の
 *   ラベルは消した。
 */
import { describe, expect, it } from "vitest";
import { PRECHECK_MINUTES_BEFORE } from "@/lib/config";
import { prechecks } from "@/lib/fixtures/prechecks";
import { translate, type Lang } from "@/lib/i18n";
import { precheckSeverityLabel } from "@/lib/prechecks/label";

const ja = (text: string) => translate("ja", text);
const en = (text: string) => translate("en", text);

function labelsFor(lang: Lang): string[] {
  const t = lang === "ja" ? ja : en;
  return prechecks.map((item) => precheckSeverityLabel(t, item));
}

describe("precheckSeverityLabel", () => {
  it("設定値の分数（60 / 30）は「◯分前異常」になる", () => {
    const [first, second] = PRECHECK_MINUTES_BEFORE;
    expect(precheckSeverityLabel(ja, { precheck_minutes: first })).toBe(`${first}分前異常`);
    expect(precheckSeverityLabel(ja, { precheck_minutes: second })).toBe(`${second}分前異常`);
  });

  it("★設定値以外の任意の分数でも組み立てられる（D-093 項2「20だったら20分前」）★", () => {
    expect(precheckSeverityLabel(ja, { precheck_minutes: 20 })).toBe("20分前異常");
    expect(precheckSeverityLabel(ja, { precheck_minutes: 45 })).toBe("45分前異常");
  });

  it("EN では対訳が効く（従来はキーが無く日本語のまま出ていた）", () => {
    expect(precheckSeverityLabel(en, { precheck_minutes: 20 })).toBe("Error 20 min before");
  });

  it("★fixtures の全件が JA で「60分前異常 / 30分前異常 / 20分前異常」になる（出発失敗は無い）★", () => {
    const labels = new Set(labelsFor("ja"));
    const [first, second] = PRECHECK_MINUTES_BEFORE;
    expect(labels).toEqual(new Set([`${first}分前異常`, `${second}分前異常`, "20分前異常"]));
  });

  it("fixtures の全件が EN でも日本語を含まない", () => {
    for (const label of labelsFor("en")) {
      expect(label).not.toMatch(/[぀-ヿ一-鿿]/);
    }
  });
});
