import { describe, it, expect } from "vitest";
import { seedOnderdelen } from "./onderdelen";

// ── Pariteit NL ↔ FR van de unieke beschrijvingsclausule ────────────────────
// "beschrijving-onroerend-goed" is dé verplichte, enige clausule voor de
// beschrijving van een onroerend goed; "beschrijving-onroerend-goed-fr" is de
// Franstalige vertaling die er verplicht gelijk mee moet blijven lopen. Deze
// test breekt zodra de twee uit elkaar groeien (andere/ontbrekende hypotheses),
// zodat een toekomstige uitbreiding altijd in beide talen samen gebeurt.

const NL_ID = "beschrijving-onroerend-goed";
const FR_ID = "beschrijving-onroerend-goed-fr";

const nl = seedOnderdelen.find((o) => o.id === NL_ID);
const fr = seedOnderdelen.find((o) => o.id === FR_ID);

describe("beschrijving onroerend goed — NL/FR pariteit", () => {
  it("beide onderdelen bestaan in de bibliotheek", () => {
    expect(nl).toBeDefined();
    expect(fr).toBeDefined();
  });

  it("de FR-versie verwijst als vertaling naar de NL-referentie", () => {
    expect(fr?.taal).toBe("fr");
    expect(fr?.vertalingVanId).toBe(NL_ID);
    expect(nl?.taal ?? "nl").toBe("nl");
  });

  it("beide horen tot dezelfde categorie 'goed'", () => {
    expect(nl?.categorie).toBe("goed");
    expect(fr?.categorie).toBe("goed");
  });

  it("dezelfde hypothese-varianten (zelfde ids, zelfde aantal en volgorde)", () => {
    const nlVarianten = nl?.varianten.map((v) => v.id) ?? [];
    const frVarianten = fr?.varianten.map((v) => v.id) ?? [];
    expect(frVarianten).toEqual(nlVarianten);
    // Minstens de basishypotheses voor de courante types onroerend goed.
    expect(nlVarianten).toEqual(
      expect.arrayContaining([
        "huis",
        "grond",
        "ander-goed-zonder-mede-eigendom",
        "appartement-mede-eigendom",
      ])
    );
  });

  it("dezelfde modeltypes (toepasbaarOp) zodat de clausule overal samen inzetbaar is", () => {
    expect([...(fr?.toepasbaarOp ?? [])].sort()).toEqual(
      [...(nl?.toepasbaarOp ?? [])].sort()
    );
  });
});
