import { describe, it, expect } from "vitest";
import { seedModellen, seedOnderdelen, genereerDocument, standaardKeuzes } from "@/data/modeldocumenten";
import { bouwGoedHerhalingen, vergelijkGoed, type GoedMetTitel } from "./oorsprong";

const GOED_A: GoedMetTitel = {
  label: "Goed 1 — woning Kerkstraat 12",
  typeVariantId: "huis",
  gemeente: "Tervuren",
  adres: "Kerkstraat 12",
  sectieTitel: "F",
  perceelnummerTitel: "60 F 22",
  oppervlakteTitel: "1a 80ca",
  sectieRecent: "F",
  perceelnummerRecent: "0060F22P0000",
  oppervlakteRecent: "180 m²",
  oudsteTitel: {
    oorspronkelijkeEigenaar: "Jan Peeters",
    rechtsvoorganger: "Marie Janssens",
    notaris: "notaris Willems",
    plaats: "Leuven",
    datum: "12 mei 1991",
    overschrijvingsreferte: "54-T-12/05/1991-07890",
  },
  schakels: [
    {
      soort: "nalatenschap",
      waarden: { naam_overledene: "Jan Peeters", plaats_overlijden: "Leuven", datum_overlijden: "3 januari 2015", naam_langstlevende: "An Peeters", namen_kinderen: "Tom en Els Peeters" },
    },
    {
      soort: "verkoop",
      waarden: { naam_verkoper_schakel: "An Peeters", naam_koper_schakel: "de verkopers", notaris_schakel: "notaris De Smet", plaats_schakel: "Tervuren", datum_schakel: "8 juni 2019", referte_schakel: "54-T-08/06/2019-01234" },
    },
  ],
};

const GOED_B: GoedMetTitel = {
  label: "Goed 2 — weiland",
  typeVariantId: "grond",
  gemeente: "Tervuren",
  adres: "Molenveldweg z/n",
  sectieTitel: "B",
  perceelnummerTitel: "125 B",
  oppervlakteTitel: "1ha 20a 35ca",
  sectieRecent: "B",
  perceelnummerRecent: "0125B00P0000",
  oppervlakteRecent: "12.035 m²",
  oudsteTitel: { oorspronkelijkeEigenaar: "Familie Maes", notaris: "notaris Willems", plaats: "Leuven", datum: "4 maart 1988" },
};

function genereerVerkoopakte(goederen: GoedMetTitel[]): string {
  const model = seedModellen.find((m) => m.id === "verkoopakte-onroerend-goed")
    ?? seedModellen.find((m) => m.akteType === "verkoopakte" && (m.taal ?? "nl") === "nl")!;
  return genereerDocument(model, [...seedOnderdelen], standaardKeuzes(model), {}, [], bouwGoedHerhalingen(goederen));
}

describe("akte met meerdere goederen en titels", () => {
  const tekst = genereerVerkoopakte([GOED_A, GOED_B]);

  it("herneemt de beschrijving én de oorsprong per goed, met eigen kop", () => {
    expect(tekst).toContain("- Goed 1 - woning Kerkstraat 12 -");
    expect(tekst).toContain("- Goed 2 - weiland -");
    // Beide kadastrale aanduidingen aanwezig
    expect(tekst).toContain("60 F 22");
    expect(tekst).toContain("0125B00P0000");
  });

  it("kiest per goed de type-hypothese van de beschrijvingsclausule", () => {
    expect(tekst).toContain("huis");
    expect(tekst).toContain("grond");
  });

  it("stelt de oorsprong samen uit de bouwstenen (schakels), zonder keuzemarkering", () => {
    // Oudste titel van goed 1
    expect(tekst).toContain("Jan Peeters");
    expect(tekst).toContain("54-T-12/05/1991-07890");
    // Schakels effectief opgenomen, in volgorde, met eigen waarden
    expect(tekst).toContain("3 januari 2015");
    expect(tekst).toContain("notaris De Smet");
    // Goed 2 heeft géén schakels: de bouwstenen blijven daar als hypotheses gemarkeerd
    const goed2Blok = tekst.slice(tekst.indexOf("- Goed 2"));
    expect(goed2Blok).toContain("KIES DE TOEPASSELIJKE HYPOTHESE");
  });

  it("leidt de oppervlaktevermelding af: zelfde oppervlakte na omzetting", () => {
    expect(tekst).toContain("dezelfde oppervlakte");
  });

  it("laat de identiteits-herhaling (per partij) ongemoeid", () => {
    expect(tekst).not.toContain("- Partij 1 -");
  });
});

describe("vergelijkGoed", () => {
  it("vindt geen afwijkingen wanneer titel en recent uittreksel overeenstemmen", () => {
    expect(vergelijkGoed(GOED_A).meldingen).toEqual([]);
    expect(vergelijkGoed(GOED_B).meldingen).toEqual([]);
  });

  it("meldt afwijkende oppervlakte en plan-afwijkingen per goed", () => {
    const afwijkend = vergelijkGoed({
      ...GOED_A,
      oppervlakteRecent: "195 m²",
      planPerceelnummer: "0060F22P0000",
      planOppervlakte: "197 m²",
    });
    expect(afwijkend.titelVsRecent.oppervlakte).toBe("verschillend");
    expect(afwijkend.titelVsRecent.oppervlakteVerschilM2).toBe(15);
    expect(afwijkend.planVsRecent?.oppervlakte).toBe("verschillend");
    expect(afwijkend.meldingen.length).toBeGreaterThanOrEqual(2);
  });
});
