// ── Synthese van nog ontbrekende stukken ─────────────────────────────────────
// De ruwe [AAN TE VULLEN: …]-velden in een ontwerp zijn lang en technisch. Deze
// module vertaalt ze naar een korte, geprioriteerde lijst van de BRONDOCUMENTEN
// die nog ontbreken (bv. eigendomstitel, EPC/PEB-certificaat, bodemattest, bod),
// zodat de notaris/agent in één oogopslag ziet wat hij nog moet opvragen.

export type Prioriteit = "hoog" | "midden" | "laag";

interface DocumentDefinitie {
  id: string;
  prioriteit: Prioriteit;
  nl: string;
  fr: string;
  /** Patronen op de parameternaam die op dit ontbrekende document wijzen. */
  velden: RegExp[];
}

// Volgorde + prioriteit weerspiegelen het belang voor een verkoop/compromis.
const DOCUMENTEN: DocumentDefinitie[] = [
  { id: "eigendomstitel", prioriteit: "hoog", nl: "Eigendomstitel (titel van eigendom)", fr: "Titre de propriété", velden: [/titel/, /eigendomsakte/, /titre_propriete/, /servitudes/, /superficie_titre/, /erfdienstbaarheden/, /bewijs_bouwjaar/, /preuve_annee_construction/] },
  { id: "kadaster", prioriteit: "hoog", nl: "Kadastraal uittreksel en opmetingsplan", fr: "Extrait cadastral et plan de mesurage", velden: [/kadast/, /cadastr/, /afdeling/, /deelgemeente/, /perceel/, /section_administrative/, /section_titre/, /\bdivision\b/, /numero_divergent/, /empietement/, /overbouw/, /description_introductive/, /description_lot/, /mesurage/, /opmetingsplan/, /denomination_lot/, /reference_plan/, /extrait_recent/, /recent_kadaster/, /rc_non_indexe/, /ki_niet_geindexeerd/, /superficie/] },
  { id: "bod", prioriteit: "hoog", nl: "Ondertekend bod / aankoopbelofte", fr: "Offre / promesse d'achat signée", velden: [/prijs/, /prix/, /voorschot/, /acompte/, /saldo/, /solde/, /waarborg/, /garantie/, /bod/, /aankoopbelofte/, /offre/, /verdeling_gekochte_delen/, /repartition_quotites/, /quotites/, /meeverkochte/, /roerende/, /biens_mobiliers/] },
  { id: "epc", prioriteit: "hoog", nl: "EPC/PEB-certificaat (energieprestatie)", fr: "Certificat PEB/EPC (performance énergétique)", velden: [/epc/, /_peb/, /verbruik/, /consommation/, /energiedeskundige/, /expert_energie/, /expert_peb/, /classe_peb/, /label_epc/] },
  { id: "bodem", prioriteit: "hoog", nl: "Bodemattest (OVAM)", fr: "Attestation du sol (OVAM)", velden: [/bodem/, /ovam/, /bdes/, /attestation_sol/, /reconnaissance_sol/, /_sol\b/] },
  { id: "stedenbouw", prioriteit: "hoog", nl: "Stedenbouwkundige inlichtingen/uittreksel", fr: "Renseignements urbanistiques", velden: [/stedenbouw/, /vergunning/, /bestemming/, /plannenregister/, /permis/, /urbanis/, /affectation/, /plan_secteur/, /inlichtingen/, /rooilijn/, /onteigening/, /expropriation/, /alignement/, /emprise/, /inneming/, /renseignements/, /lettre_commune/, /brief_gemeente/, /registre_plans/, /destination_partie/, /voorkooprecht/, /voorkeurrecht/, /preemption/, /preference/, /wederinkoop/, /rachat/] },
  { id: "hypotheek", prioriteit: "midden", nl: "Hypothecaire toestand / hypotheekattest", fr: "État hypothécaire", velden: [/schuldeiser/, /inschrijving/, /hypothec/, /hypotheek/] },
  { id: "elektrische-keuring", prioriteit: "midden", nl: "Keuring elektrische installatie", fr: "Contrôle de l'installation électrique", velden: [/keuring_elektr/, /keuringsorganisme/, /controle_electric/] },
  { id: "overstroming", prioriteit: "midden", nl: "Overstromingsattest (P-/G-score)", fr: "Attestation d'inondation", velden: [/overstroming/, /p_score/, /g_score/, /inondation/] },
  { id: "asbest", prioriteit: "midden", nl: "Asbestinventarisattest", fr: "Attestation d'inventaire amiante", velden: [/asbest/, /amiante/] },
  { id: "erfgoed", prioriteit: "midden", nl: "Onroerend-erfgoedinformatie", fr: "Informations patrimoine immobilier", velden: [/erfgoed/, /beschermingsbesluit/, /patrimoine/, /arrete_protection/, /infractions_patrimoine/, /inventaire_patrimoine/] },
  { id: "mede-eigendom", prioriteit: "midden", nl: "Mede-eigendom: basisakte, RIO en syndicusinfo", fr: "Copropriété : acte de base, ROI et infos du syndic", velden: [/mede.?eigendom/, /syndic/, /basisakte/, /aandeel_gemene/, /quote_part/, /copropriete/, /vme/] },
  { id: "stookolietank", prioriteit: "laag", nl: "Keuringsattest stookolietank", fr: "Attestation citerne à mazout", velden: [/stookolie/, /citerne/, /mazout/] },
  { id: "pid", prioriteit: "laag", nl: "Postinterventiedossier (PID)", fr: "Dossier d'intervention ultérieure (DIU)", velden: [/postinterventie/, /^pid/, /diu/, /bouwheer/, /startverklaring/, /maitre_ouvrage/, /declaration_debut_travaux/] },
];

const PRIO_VOLGORDE: Record<Prioriteit, number> = { hoog: 0, midden: 1, laag: 2 };

export interface OntbrekendDocument {
  id: string;
  prioriteit: Prioriteit;
  label: string;
}

export interface DocumentenSynthese {
  documenten: OntbrekendDocument[];
  /** Ontbrekende velden die niet aan een document konden worden gekoppeld. */
  overige: string[];
}

/**
 * Vertaalt de ontbrekende [AAN TE VULLEN]-velden naar een geprioriteerde lijst
 * van ontbrekende brondocumenten (in de gevraagde taal), plus de resterende
 * losse velden die niet aan een document konden worden gekoppeld.
 */
export function syntheseOntbrekendeDocumenten(velden: string[], taal: "nl" | "fr" = "nl"): DocumentenSynthese {
  const gekoppeld = new Set<string>();
  const documenten: OntbrekendDocument[] = [];
  for (const doc of DOCUMENTEN) {
    const raakt = velden.filter((v) => doc.velden.some((rx) => rx.test(v)));
    if (raakt.length === 0) continue;
    raakt.forEach((v) => gekoppeld.add(v));
    documenten.push({ id: doc.id, prioriteit: doc.prioriteit, label: taal === "fr" ? doc.fr : doc.nl });
  }
  documenten.sort((a, b) => PRIO_VOLGORDE[a.prioriteit] - PRIO_VOLGORDE[b.prioriteit]);
  const overige = velden.filter((v) => !gekoppeld.has(v));
  return { documenten, overige };
}
