import { describe, it, expect } from "vitest";
import { waarneming, eersteMatch, zoekBedrag, zoekDatumISO, zoekDatumNaLabel } from "./extractie-hulp";
import type { Brondocument } from "./perceptie";

// ── AUT-S1 · Gedeelde extractie-hulp ─────────────────────────────────────────

const doc: Brondocument = { ref: "stuk-1.pdf", bronType: "compromis", tekst: "" };

describe("waarneming", () => {
  it("hangt bron en ref van het document aan de waarneming", () => {
    const w = waarneming(doc, "prijs", 385000, "zeker");
    expect(w).toEqual({ veldpad: "prijs", waarde: 385000, bronType: "compromis", brondocumentRef: "stuk-1.pdf", zekerheid: "zeker" });
  });
});

describe("eersteMatch", () => {
  it("geeft de eerste vanggroep van het eerste matchende patroon (getrimd)", () => {
    expect(eersteMatch("Gemeente:  Tervuren\n", [/Gemeente:\s*(.+)/])).toBe("Tervuren");
  });
  it("geeft undefined als niets matcht", () => {
    expect(eersteMatch("niets hier", [/Gemeente:\s*(.+)/])).toBeUndefined();
  });
});

describe("zoekBedrag — Belgische conventie", () => {
  it("leest een bedrag met duizendpunt en decimaalkomma", () => {
    expect(zoekBedrag("Prijs: 385.000,00 EUR", [/Prijs:\s*([\d.,]+)/])).toBe(385000);
  });
  it("leest een kaal bedrag", () => {
    expect(zoekBedrag("bedrag 250000 euro", [/bedrag\s*([\d.,]+)/])).toBe(250000);
  });
  it("geeft undefined bij geen match of niet-positief bedrag", () => {
    expect(zoekBedrag("geen bedrag", [/Prijs:\s*([\d.,]+)/])).toBeUndefined();
    expect(zoekBedrag("Prijs: 0", [/Prijs:\s*([\d.,]+)/])).toBeUndefined();
  });
});

describe("zoekDatumISO", () => {
  it("herkent ISO zelf", () => {
    expect(zoekDatumISO("op 2026-03-15 verleden")).toBe("2026-03-15");
  });
  it("herkent dag/maand/jaar met scheidingstekens", () => {
    expect(zoekDatumISO("15/03/2026")).toBe("2026-03-15");
    expect(zoekDatumISO("15-3-2026")).toBe("2026-03-15");
    expect(zoekDatumISO("15.03.2026")).toBe("2026-03-15");
  });
  it("herkent de geschreven vorm met NL en FR maandnaam", () => {
    expect(zoekDatumISO("15 maart 2026")).toBe("2026-03-15");
    expect(zoekDatumISO("le 15 mars 2026")).toBe("2026-03-15");
  });
  it("raadt een voluit geschreven datum niet", () => {
    expect(zoekDatumISO("vijftien maart tweeduizend zesentwintig")).toBeUndefined();
  });
  it("weigert een onmogelijke datum", () => {
    expect(zoekDatumISO("32/13/2026")).toBeUndefined();
  });
});

describe("zoekDatumNaLabel", () => {
  it("haalt de datum die op een label volgt", () => {
    expect(zoekDatumNaLabel("Compromis dd. 15/03/2026 te Tervuren", [/Compromis dd\.\s*(.+)/])).toBe("2026-03-15");
  });
});
