// ── AUT-S1 · Extractor: compromis (onderhandse verkoopovereenkomst) ──────────
// Leest de kernvelden uit een verkoopcompromis: prijs, voorschot, datum, het
// adres en de kadastrale aanduiding van het goed. Het compromis is een
// ONDERHANDSE bron (lager brongezag dan de eigendomstitel) — de merge
// (tegenstrijdigheden.ts, bronPrioriteit) laat de authentieke titel primeren
// waar die afwijkt. Nooit gokken: een niet-gevonden veld blijft weg.

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

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

  const prijs = zoekBedrag(t, [
    /(?:koopprijs|verkoopprijs|prijs)\s*(?:van|:|bedraagt|wordt bepaald op|is vastgesteld op)?\s*(?:€|EUR)?\s*([\d.]+(?:,\d{2})?)/i,
  ]);
  if (prijs !== undefined) w.push(waarneming(doc, "prijs", prijs, "zeker"));

  const voorschot = zoekBedrag(t, [
    /(?:voorschot|waarborgsom|waarborg)\s*(?:van|:|bedraagt|ten belope van)?\s*(?:€|EUR)?\s*([\d.]+(?:,\d{2})?)/i,
  ]);
  if (voorschot !== undefined) w.push(waarneming(doc, "voorschot", voorschot, "zeker"));

  // Datum na een expliciet label is betrouwbaar; anders de eerste datum in het
  // stuk (lagere zekerheid — kan bv. een geboortedatum zijn).
  const gelabeld = zoekDatumNaLabel(t, [
    /(?:ondertekend|opgemaakt|overeengekomen)\s+(?:te\s+\S+\s+)?op\s*(.+)/i,
    /(?:compromis|verkoopovereenkomst)\s+(?:dd\.?|van|d\.d\.)\s*(.+)/i,
    /datum\s*(?:compromis|ondertekening)?\s*:\s*(.+)/i,
  ]);
  if (gelabeld) {
    w.push(waarneming(doc, "compromisdatum", gelabeld, "zeker"));
  } else {
    const eersteDatum = zoekDatumISO(t);
    if (eersteDatum) w.push(waarneming(doc, "compromisdatum", eersteDatum, "waarschijnlijk"));
  }

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

  const kadaster = eersteMatch(t, [
    /kadast\w*\s*(?:gekend|bekend)?\s*(?:als)?\s*:?\s*([^\n]+)/i,
  ])?.replace(/[.\s]+$/, "");
  if (kadaster) w.push(waarneming(doc, "goed.kadastraleGegevens", kadaster, "waarschijnlijk"));

  // Partijnamen zijn foutgevoelig (vrije tekst) → lage zekerheid, escaleert.
  const verkoper = eersteMatch(t, [/\bverkoper[s]?\s*:\s*([^\n,]+)/i]);
  if (verkoper) w.push(waarneming(doc, "partijen.verkoper", verkoper, "onzeker"));
  // \b vóór "koper" voorkomt dat de "Verkoper:"-regel wordt opgevist.
  const koper = eersteMatch(t, [/\bkoper[s]?\s*:\s*([^\n,]+)/i]);
  if (koper) w.push(waarneming(doc, "partijen.koper", koper, "onzeker"));

  return w;
}

export const compromisExtractors: ExtractorRegistratie[] = [
  { bronType: "compromis", extractor: extractCompromis },
];
