/**
 * アラート種別ラベルの期待値表（指示書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 の指摘）。対訳を入れたことを固定する。
 */
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, { severity: "precheck", precheck_minutes: first })
    ).toBe(`${first}分前異常`);
    expect(
      precheckSeverityLabel(ja, { severity: "precheck", precheck_minutes: second })
    ).toBe(`${second}分前異常`);
  });

  it("★設定値以外の任意の分数でも組み立てられる（D-093 項2「20だったら20分前」）★", () => {
    expect(
      precheckSeverityLabel(ja, { severity: "precheck", precheck_minutes: 20 })
    ).toBe("20分前異常");
    expect(
      precheckSeverityLabel(ja, { severity: "precheck", precheck_minutes: 45 })
    ).toBe("45分前異常");
  });

  it("launch_failed は「出発失敗」（分数を出さない）", () => {
    expect(
      precheckSeverityLabel(ja, { severity: "launch_failed", precheck_minutes: null })
    ).toBe("出発失敗");
  });

  it("precheck なのに分数が null なら「事前チェック異常」に倒す（空文字にしない）", () => {
    const label = precheckSeverityLabel(ja, {
      severity: "precheck",
      precheck_minutes: null,
    });
    expect(label).toBe("事前チェック異常");
    expect(label).not.toBe("");
    expect(label).not.toContain("null");
  });

  it("EN では対訳が効く（従来はキーが無く日本語のまま出ていた）", () => {
    expect(
      precheckSeverityLabel(en, { severity: "launch_failed", precheck_minutes: null })
    ).toBe("Launch failed");
    expect(
      precheckSeverityLabel(en, { severity: "precheck", precheck_minutes: 20 })
    ).toBe("Error 20 min before");
    expect(
      precheckSeverityLabel(en, { severity: "precheck", precheck_minutes: null })
    ).toBe("Pre-check error");
  });

  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(/[぀-ヿ一-鿿]/);
    }
  });
});
