// ── AUT-S1 · Extractor: eigendomstitel (authentieke aankoop-/verkrijgingsakte) ─
// Leest de titeldatum, het adres, de kadastrale aanduiding VOLGENS TITEL en de
// vermelde erfdienstbaarheden. De eigendomstitel is de gezaghebbendste bron
// (bronPrioriteit 1): waar ze afwijkt van het compromis, primeert ze in de
// merge. De kadastrale gegevens gaan bewust naar de *Titel-velden (sectieTitel/
// perceelnummerTitel/oppervlakteTitel), die letterlijk de titel weergeven en
// niet met het actuele kadaster vermengd mogen worden.

import type { Brondocument, ExtractorRegistratie, GeextraheerdeWaarneming } from "../perceptie";
import { waarneming, eersteMatch, zoekDatumISO, zoekDatumNaLabel } from "../extractie-hulp";

function extractEigendomstitel(doc: Brondocument): GeextraheerdeWaarneming[] {
  const t = doc.tekst;
  const w: GeextraheerdeWaarneming[] = [];

  const datum = zoekDatumNaLabel(t, [
    /(?:akte\s+verleden|verleden|aankoopakte|titel)\s+(?:op|dd\.?|d\.d\.|van)\s*(.+)/i,
    /datum\s+(?:van de\s+)?(?:akte|titel)\s*:?\s*(.+)/i,
  ]);
  if (datum) w.push(waarneming(doc, "eigendomstitel.datum", datum, "zeker"));

  const adres = eersteMatch(t, [
    /(?:onroerend goed|woning|eigendom|goed)\s+gelegen\s+te\s*:?\s*([^\n.]+)/i,
    /gelegen\s+te\s*:?\s*([^\n.]+)/i,
  ]);
  if (adres) w.push(waarneming(doc, "goed.adres", adres, "zeker"));

  const sectie = eersteMatch(t, [/sectie\s+([A-Z][0-9]*)\b/i]);
  if (sectie) w.push(waarneming(doc, "goed.sectieTitel", sectie, "zeker"));

  const perceel = eersteMatch(t, [
    /(?:ten kadaster (?:gekend|bekend)|gekadastreerd)[^\n]*?(?:nummer|nr\.?)\s*([0-9][0-9A-Z ]*[0-9A-Z]|\d+)/i,
    /(?:perceel)?nummer\s+([0-9][0-9A-Z ]*[0-9A-Z]|\d+)/i,
  ]);
  if (perceel) w.push(waarneming(doc, "goed.perceelnummerTitel", perceel.trim(), "waarschijnlijk"));

  const oppervlakte = eersteMatch(t, [
    /groot\s+([^\n.]*(?:vierkante meter|centiare|are|m²|m2|ca))\b/i,
  ]);
  if (oppervlakte) w.push(waarneming(doc, "goed.oppervlakteTitel", oppervlakte.trim(), "waarschijnlijk"));

  // Zonder het label geen datum-fallback voor de titel: een verkeerde titeldatum
  // is juridisch zwaarwegend. Wél de eerste datum enkel als er GEEN gelabelde was.
  if (!datum) {
    const eerste = zoekDatumISO(t);
    if (eerste) w.push(waarneming(doc, "eigendomstitel.datum", eerste, "onzeker"));
  }

  const erfdienst = eersteMatch(t, [
    /erfdienstbaarhe(?:id|den)\s*:?\s*([^\n]+)/i,
    /(?:onder de last van|belast met)\s*:?\s*([^\n]+)/i,
  ]);
  if (erfdienst) w.push(waarneming(doc, "eigendomstitel.erfdienstbaarheden", erfdienst.replace(/[.\s]+$/, ""), "waarschijnlijk"));

  return w;
}

export const eigendomstitelExtractors: ExtractorRegistratie[] = [
  { bronType: "eigendomstitel", extractor: extractEigendomstitel },
];
