import type { Modelonderdeel } from "./types";
import { partijenOnderdelen } from "./onderdelen/partijen";
import { fransOnderdelen } from "./onderdelen/frans";

// ── Demo-identiteiten uit de canonieke identiteitsclausule ───────────────────
// De notariswet vereist de volledige identificatie van elke comparant; het
// kantoor heeft daarvoor precies ÉÉN clausule: "identiteit-partijen" (+ FR-
// spiegel), met de vaste volgorde en de huwelijksgegevens (stelsel,
// huwelijksovereenkomst, latere wijzigingen) op een eigen alinea. De
// voorbeeldweergaven van ALLE akten en overeenkomsten die de identiteit via
// een vlakke parameter tonen ({{identiteit_verkopers}}, {{identite_vendeurs}},
// …) moeten diezelfde clausule hergebruiken (opdracht notaris 2026-07-11:
// "er bestaat er al een met ook huwelijksstelsel en wijzigingen etc. —
// hergebruik die in alle akten en overeenkomsten"). Dit bestand genereert de
// demo-identiteitsblokken daarom RECHTSTREEKS uit de varianttekst van de
// canonieke clausule, met fictieve maar realistische waarden: wijzigt de
// clausule, dan volgen alle voorbeelden vanzelf. Nooit dossierdata.

function canoniekeClausule(taal: "nl" | "fr"): Modelonderdeel | undefined {
  return taal === "fr"
    ? fransOnderdelen.find((o) => o.id === "identiteit-partijen-fr")
    : partijenOnderdelen.find((o) => o.id === "identiteit-partijen");
}

/**
 * Vult één hypothese van de canonieke clausule in met demo-waarden.
 *
 * De facultatieve passages worden zoals in een echt ingevuld dossier
 * afgehandeld: de geneste "in vervanging van …"-passage vervalt (de
 * demo-notaris was niet verhinderd), de omringende huwelijksovereenkomst-
 * passage blijft staan zodat het voorbeeld toont hoe stelsel, overeenkomst
 * en wijzigingen vermeld worden.
 */
function vulHypotheseIn(
  taal: "nl" | "fr",
  variantId: string,
  waarden: Record<string, string>,
  vrouwelijk: boolean
): string {
  const variant = canoniekeClausule(taal)?.varianten.find((v) => v.id === variantId);
  if (!variant) return "";
  let t = variant.tekst;
  t = t.replace(/\[(?:NAKIJKEN OF SCHRAPPEN|A VERIFIER OU SUPPRIMER): (?:in vervanging van|substituant)[^\][]*\]\s*/g, "");
  let vorige;
  do {
    vorige = t;
    t = t.replace(/\[(?:NAKIJKEN OF SCHRAPPEN|A VERIFIER OU SUPPRIMER): ([^\][]*)\]/g, "$1");
  } while (t !== vorige);
  t = t.replace(/\{\{(\w+)\}\}/g, (m, naam) => waarden[naam] ?? m);
  // Franse tweevormen naar het geslacht van de demo-persoon ("né(e)" → "né"/
  // "née"); de Nederlandse varianttekst kent zulke vormen niet.
  if (taal === "fr") t = t.replace(/([A-Za-zÀ-ÿ]+)\(e\)/g, (_, stam) => (vrouwelijk ? `${stam}e` : stam));
  return t.trim();
}

// Vaste demo-cast, afgestemd op de rolgebonden namen in voorbeeldwaarden.ts
// (verkoper Jan Peeters, koper Marie Janssens, echtgenote Sofie De Smet).
const VERKOPER_NL: Record<string, string> = {
  aanspreking: "De heer",
  naam_voluit: "PEETERS Jan August",
  geboorteplaats: "Leuven",
  geboortedatum: "12 maart 1985",
  rijksregisternummer: "85.03.12-345.67",
  adres: "3000 Leuven, Kerkstraat 12",
  naam_echtgenoot: "mevrouw De Smet Sofie",
  plaats_huwelijk: "Leuven",
  datum_huwelijk: "5 september 2012",
  huwelijksstelsel: "scheiding van goederen",
  notaris_huwelijkscontract: "Ann Janssens",
  plaats_huwelijkscontract: "Leuven",
  datum_huwelijkscontract: "28 augustus 2012",
  stelselwijziging_zin: "welk stelsel tot op heden niet werd gewijzigd",
  declaratie_enkelvoud: "zoals hij verklaart",
};

const VERKOPER_FR: Record<string, string> = {
  aanspreking: "Monsieur",
  naam_voluit: "DUPONT Jean Auguste",
  geboorteplaats: "Louvain",
  geboortedatum: "12 mars 1985",
  rijksregisternummer: "85.03.12-345.67",
  adres: "1000 Bruxelles, Rue de l'Église 12",
  naam_echtgenoot: "Madame Lambert Sophie",
  plaats_huwelijk: "Louvain",
  datum_huwelijk: "5 septembre 2012",
  huwelijksstelsel: "la séparation de biens",
  notaris_huwelijkscontract: "Ann Janssens",
  plaats_huwelijkscontract: "Louvain",
  datum_huwelijkscontract: "28 août 2012",
  stelselwijziging_zin: "lequel régime n'a pas été modifié à ce jour",
  declaratie_enkelvoud: "ainsi qu'il le déclare",
};

const KOPER_NL: Record<string, string> = {
  aanspreking: "Mevrouw",
  naam_voluit: "JANSSENS Marie Sofie",
  geboorteplaats: "Mechelen",
  geboortedatum: "5 juli 1990",
  rijksregisternummer: "90.07.05-222.33",
  adres: "3080 Tervuren, Dorpsstraat 12",
};

const KOPER_FR: Record<string, string> = {
  aanspreking: "Madame",
  naam_voluit: "DURAND Marie Sophie",
  geboorteplaats: "Malines",
  geboortedatum: "5 juillet 1990",
  rijksregisternummer: "90.07.05-222.33",
  adres: "3080 Tervuren, Dorpsstraat 12",
};

/**
 * Demo-identiteitsblok van de verkoper/overdrager: de hypothese "gehuwd" van
 * de canonieke clausule, zodat het voorbeeld ook de huwelijksgegevens
 * (stelsel, huwelijksovereenkomst, wijzigingen) toont.
 */
export const IDENTITEIT_VERKOPER_DEMO = {
  nl: vulHypotheseIn("nl", "gehuwd", VERKOPER_NL, false),
  fr: vulHypotheseIn("fr", "gehuwd", VERKOPER_FR, false),
};

/** Demo-identiteitsblok van de koper/verkrijger: de hypothese "ongehuwd". */
export const IDENTITEIT_KOPER_DEMO = {
  nl: vulHypotheseIn("nl", "ongehuwd", KOPER_NL, true),
  fr: vulHypotheseIn("fr", "ongehuwd", KOPER_FR, true),
};
