import { describe, it, expect } from "vitest";
import { pasKenmerkRegelsToe, SCHENKING_REGELS, AKTE_REGELS, type KenmerkRegel } from "./kenmerken-regels";

// ── Generieke kenmerk-regels: drieledige semantiek + FR-pariteit ─────────────

const OPNEMEN_REGEL: KenmerkRegel = {
  soort: "opnemen",
  kenmerk: "voorbehoudVruchtgebruik",
  onderdeelId: "test-onderdeel",
};

const VARIANT_REGEL: KenmerkRegel = {
  soort: "variant",
  kenmerk: "rechtVanTerugkeer",
  onderdeelId: "test-onderdeel",
  variantBij: { conventioneel: "variant-a", wettelijk: "variant-b" },
};

describe("pasKenmerkRegelsToe — opnemen-regel", () => {
  it("true → opnemen, in NL én FR-spiegel", () => {
    const keuzes = pasKenmerkRegelsToe({ voorbehoudVruchtgebruik: true }, [OPNEMEN_REGEL]);
    expect(keuzes).toEqual([
      { onderdeelId: "test-onderdeel", opnemen: true },
      { onderdeelId: "test-onderdeel-fr", opnemen: true },
    ]);
  });

  it("false → uitdrukkelijk weglaten (conditie bevestigd), in beide talen", () => {
    const keuzes = pasKenmerkRegelsToe({ voorbehoudVruchtgebruik: false }, [OPNEMEN_REGEL]);
    expect(keuzes).toEqual([
      { onderdeelId: "test-onderdeel", opnemen: false, conditieBevestigd: true },
      { onderdeelId: "test-onderdeel-fr", opnemen: false, conditieBevestigd: true },
    ]);
  });

  it("onbekend → geen keuze (veiligheidsprincipe: nooit een blinde gok)", () => {
    expect(pasKenmerkRegelsToe({}, [OPNEMEN_REGEL])).toEqual([]);
  });

  it("variantBijTrue en bevestigConditie sturen de opname-keuze mee", () => {
    const regel: KenmerkRegel = { ...OPNEMEN_REGEL, variantBijTrue: "vast", bevestigConditie: true };
    expect(pasKenmerkRegelsToe({ voorbehoudVruchtgebruik: true }, [regel])[0]).toEqual({
      onderdeelId: "test-onderdeel",
      opnemen: true,
      variantId: "vast",
      conditieBevestigd: true,
    });
  });

  it("frSpiegel: false stuurt enkel het NL-onderdeel aan", () => {
    const regel: KenmerkRegel = { ...OPNEMEN_REGEL, frSpiegel: false };
    const keuzes = pasKenmerkRegelsToe({ voorbehoudVruchtgebruik: true }, [regel]);
    expect(keuzes).toEqual([{ onderdeelId: "test-onderdeel", opnemen: true }]);
  });
});

describe("pasKenmerkRegelsToe — variant-regel", () => {
  it("gekende waarde → variant in beide talen", () => {
    const keuzes = pasKenmerkRegelsToe({ rechtVanTerugkeer: "conventioneel" }, [VARIANT_REGEL]);
    expect(keuzes).toEqual([
      { onderdeelId: "test-onderdeel", variantId: "variant-a" },
      { onderdeelId: "test-onderdeel-fr", variantId: "variant-a" },
    ]);
  });

  it("onbekend kenmerk → geen keuze", () => {
    expect(pasKenmerkRegelsToe({}, [VARIANT_REGEL])).toEqual([]);
  });
});

describe("regeltabellen", () => {
  it("SCHENKING_REGELS dekt de zes schenking-kenmerken", () => {
    expect(SCHENKING_REGELS.map((r) => r.kenmerk).sort()).toEqual([
      "lastHulpEnBijstand",
      "meerdereBegiftigden",
      "minderjarigeBegiftigde",
      "rechtVanTerugkeer",
      "schenkingEigenGoedDoorGehuwde",
      "voorbehoudVruchtgebruik",
    ]);
  });

  it("AKTE_REGELS stuurt de vertegenwoordigingsclausule aan", () => {
    const keuzes = pasKenmerkRegelsToe({ partijVertegenwoordigd: false }, AKTE_REGELS);
    expect(keuzes).toContainEqual({
      onderdeelId: "vertegenwoordiging-volmacht",
      opnemen: false,
      conditieBevestigd: true,
    });
    expect(keuzes).toContainEqual({
      onderdeelId: "vertegenwoordiging-volmacht-fr",
      opnemen: false,
      conditieBevestigd: true,
    });
  });
});
