// ── AUT-F5 · Observability van de nieuwe lagen ───────────────────────────────
// De mappers zetten perceptie-/poortuitkomsten om naar gebruikslog-events.
// Kerninvariant naast de inhoud: GDPR — nooit een ref/bestandsnaam, payload of
// waargenomen waarde in het event, enkel bronTYPE, veldpad of dienstnaam.

import { describe, expect, it } from "vitest";
import {
  extraheerUitBrondocumenten,
  gebruikslogEventsUitPerceptie,
  type Brondocument,
  type PerceptieRegister,
} from "./dossier/perceptie";
import { gebruikslogEventUitPoort, type GepoorteUitvoering } from "./connectoren/connector";

const DOCUMENTEN: Brondocument[] = [
  { ref: "compromis-jansens.pdf", bronType: "compromis", tekst: "…" },
  { ref: "epc-2026.pdf", bronType: "epc", tekst: "…" },
];

const REGISTER: PerceptieRegister = {
  compromis: () => [
    { veldpad: "prijs", waarde: 400000, bronType: "compromis", zekerheid: "zeker" },
    { veldpad: "goed.adres", waarde: "Proefstraat 1", bronType: "compromis", zekerheid: "zeker" },
  ],
  // epc bewust zonder extractor → onbekende bron.
};

describe("gebruikslogEventsUitPerceptie (AUT-F5)", () => {
  it("meldt onbekende bronnen (als bronTYPE), ontbrekende en tegenstrijdige vereiste velden", () => {
    const extractie = extraheerUitBrondocumenten(DOCUMENTEN, REGISTER);
    extractie.waarnemingen.push({ veldpad: "goed.adres", waarde: "Proefstraat 2", bronType: "epc", zekerheid: "zeker" });

    const events = gebruikslogEventsUitPerceptie(DOCUMENTEN, extractie, ["prijs", "goed.adres", "compromisdatum"]);
    expect(events).toEqual([
      { type: "perceptie_onbekende_bron", waarde: "epc" },
      { type: "perceptie_veld_tegenstrijdig", waarde: "goed.adres" },
      { type: "perceptie_veld_ontbreekt", waarde: "compromisdatum" },
    ]);
  });

  it("GDPR: events bevatten nooit een ref/bestandsnaam of waargenomen waarde", () => {
    const extractie = extraheerUitBrondocumenten(DOCUMENTEN, REGISTER);
    const events = gebruikslogEventsUitPerceptie(DOCUMENTEN, extractie, ["prijs"]);
    const alleWaarden = events.map((e) => e.waarde).join(" ");
    expect(alleWaarden).not.toMatch(/jansens|\.pdf|400000|Proefstraat/);
  });

  it("een volledige, eenduidige perceptie levert geen signalen op", () => {
    const extractie = extraheerUitBrondocumenten([DOCUMENTEN[0]], REGISTER);
    expect(gebruikslogEventsUitPerceptie([DOCUMENTEN[0]], extractie, ["prijs", "goed.adres"])).toEqual([]);
  });
});

describe("gebruikslogEventUitPoort (AUT-F5)", () => {
  const basis = { reden: "test", auditKetting: [] };

  it("zet escalatie, verbod en connectorfout om naar het juiste event", () => {
    expect(gebruikslogEventUitPoort("registratie", { ...basis, uitkomst: "geescaleerd" }))
      .toEqual({ type: "connector_geescaleerd", waarde: "registratie" });
    expect(gebruikslogEventUitPoort("registratie", { ...basis, uitkomst: "verboden" }))
      .toEqual({ type: "connector_verboden", waarde: "registratie" });
    const fout: GepoorteUitvoering = {
      ...basis,
      uitkomst: "uitgevoerd",
      antwoord: { status: "fout", foutcode: "geen-fixture", reden: "…" },
    };
    expect(gebruikslogEventUitPoort("bodemattest", fout))
      .toEqual({ type: "connector_fout", waarde: "bodemattest:geen-fixture" });
  });

  it("een geslaagde uitvoering is geen signaal (null) en lekt geen payload/resultaat", () => {
    const ok: GepoorteUitvoering = {
      ...basis,
      uitkomst: "uitgevoerd",
      antwoord: { status: "ok", resultaat: { geheim: "PROEFPERSOON" }, herhaald: false },
    };
    expect(gebruikslogEventUitPoort("bodemattest", ok)).toBeNull();
  });
});
