import { describe, it, expect } from "vitest";
// ── Bewaking van de connector-fixtures (AUT-F3) ──────────────────────────────
// Drie invarianten: (1) volledigheid — élke dienst uit het ConnectorDienst-
// contract heeft minstens twee scenario's (een "schoon" en een "belast" pad);
// (2) registerhygiëne — unieke, welgevormde ids; (3) GDPR — alles fictief:
// de verplichte marker, uitsluitend de afgesproken proefnamen en enkel het
// herkenbaar ongeldige rijksregisternummer-patroon 00.00.00-000.xx.

import { alleConnectorFixtures, fixturesVoorDienst, fixtureOpId } from "./register";
import type { ConnectorDienst } from "./types";

const ALLE_DIENSTEN: ConnectorDienst[] = [
  "hypothecaire-staat",
  "kadastraal-uittreksel",
  "stedenbouwkundige-inlichtingen",
  "bodemattest",
  "fiscale-sociale-notificaties",
  "voorkooprechten",
  "registratie",
  "hypothecaire-overschrijving",
];

describe("connector-fixtures (AUT-F3)", () => {
  it("dekt elke dienst uit het contract met minstens één scenario (kadaster: uittreksel; overige: schoon + belast)", () => {
    for (const dienst of ALLE_DIENSTEN) {
      const fixtures = fixturesVoorDienst(dienst);
      // Het kadastraal uittreksel kent geen zinvol "belast" scenario (het is
      // beschrijvend); elke andere dienst heeft beide takken van de logica.
      const minimum = dienst === "kadastraal-uittreksel" ? 1 : 2;
      expect(fixtures.length, `dienst '${dienst}' heeft te weinig scenario's`).toBeGreaterThanOrEqual(minimum);
    }
  });

  it("heeft unieke, welgevormde ids (<dienst>/<scenario>) en een werkende opzoeking", () => {
    const ids = alleConnectorFixtures.map((f) => f.id);
    expect(new Set(ids).size).toBe(ids.length);
    for (const f of alleConnectorFixtures) {
      expect(f.id).toBe(`${f.dienst}/${f.scenario}`);
      expect(fixtureOpId(f.id)).toBe(f);
    }
    expect(fixtureOpId("bestaat/niet")).toBeUndefined();
  });

  it("bevat uitsluitend fictieve data (marker, proefnamen, ongeldig RRN-patroon)", () => {
    for (const f of alleConnectorFixtures) {
      expect(f.fictief, `fixture '${f.id}' mist de fictief-marker`).toBe(true);
      const json = JSON.stringify(f);
      // Elk rijksregisternummer-achtig patroon moet het afgesproken, herkenbaar
      // ongeldige 00.00.00-000.xx-patroon zijn (echte RRN's beginnen nooit zo).
      for (const rrn of json.match(/\d{2}\.\d{2}\.\d{2}-\d{3}\.\d{2}/g) ?? []) {
        expect(rrn.startsWith("00.00.00-000."), `fixture '${f.id}' bevat een echt-lijkend RRN: ${rrn}`).toBe(true);
      }
      // Natuurlijke personen heten uitsluitend PROEFPERSOON of SPECIMEN; de
      // aanwezigheid van een expliciete FICTIEF-referte in het resultaat maakt
      // de herkomst ook in gegenereerde documenten herkenbaar.
      expect(/PROEFPERSOON|SPECIMEN|FICTIEF/.test(json), `fixture '${f.id}' draagt geen herkenbaar fictief spoor`).toBe(true);
    }
  });
});
