import { describe, it, expect } from "vitest";
import { maakMockConnector, voerUitMetPoort, type ConnectorAanvraag } from "./connector";
import { bepaalZekerheid, veiligeStandaardregel, type AutonomieRegel } from "@/lib/dossier/autonomie";

// ── AUT-O5 · Connector-architectuur ──────────────────────────────────────────

const aanvraag = (over: Partial<ConnectorAanvraag> = {}): ConnectorAanvraag => ({
  dienst: "hypothecaire-staat",
  idempotentiesleutel: "dossier-1/hyp/1",
  payload: {},
  ...over,
});

describe("maakMockConnector — antwoordt uit de AUT-F3-fixtures", () => {
  it("geeft het fixture-resultaat terug voor een gekend scenario", async () => {
    const c = maakMockConnector("hypothecaire-staat", "opzoeking");
    const r = await c.voerUit(aanvraag({ mockScenario: "schoon" }));
    expect(r.status).toBe("ok");
    if (r.status === "ok") expect(r.herhaald).toBe(false);
  });

  it("dedupet op de idempotentiesleutel (herhaling voert niet opnieuw uit)", async () => {
    const c = maakMockConnector("registratie", "formaliteit");
    const a = aanvraag({ dienst: "registratie", idempotentiesleutel: "dossier-1/reg/1" });
    const eerste = await c.voerUit(a);
    const tweede = await c.voerUit(a);
    expect(eerste.status).toBe("ok");
    if (eerste.status === "ok") expect(eerste.herhaald).toBe(false);
    if (tweede.status === "ok") expect(tweede.herhaald).toBe(true);
  });

  it("geeft een nette fout bij een onbekend scenario (nooit werpen)", async () => {
    const c = maakMockConnector("hypothecaire-staat", "opzoeking");
    const r = await c.voerUit(aanvraag({ mockScenario: "bestaat-niet" }));
    expect(r.status).toBe("fout");
  });
});

describe("voerUitMetPoort — tier-3-poort (AUT-O1) + audit (AUT-O2)", () => {
  const zeker = bepaalZekerheid([{ omschrijving: "alle feiten aanwezig", positief: true }]);

  it("escaleert (en roept de connector NIET aan) als autonomie niet is aangezet", async () => {
    const c = maakMockConnector("registratie", "formaliteit");
    const r = await voerUitMetPoort({
      connector: c,
      aanvraag: aanvraag({ dienst: "registratie" }),
      regel: veiligeStandaardregel("registratie", "hoog"), // default-deny
      zekerheid: zeker,
      auditKetting: [],
      dossierRef: "dossier-1",
      tijdstip: "2026-07-05T11:35:00.000Z",
    });
    expect(r.uitkomst).toBe("geescaleerd");
    expect(r.antwoord).toBeUndefined();
    expect(r.auditKetting).toHaveLength(1);
    expect(r.auditKetting[0].besluit.beslissing).toBe("escaleren");
  });

  it("voert autonoom uit én logt, als autonomie aan staat en de zekerheid voldoet", async () => {
    const c = maakMockConnector("hypothecaire-staat", "opzoeking");
    const regel: AutonomieRegel = { handelingstype: "hypothecaire-staat", tier: "handelen-extern", impact: "laag", autonoomToegestaan: true, minimumNiveau: "zeker" };
    const r = await voerUitMetPoort({
      connector: c,
      aanvraag: aanvraag({ mockScenario: "schoon" }),
      regel,
      zekerheid: zeker,
      auditKetting: [],
      dossierRef: "dossier-1",
      tijdstip: "2026-07-05T11:36:00.000Z",
    });
    expect(r.uitkomst).toBe("uitgevoerd");
    expect(r.antwoord?.status).toBe("ok");
    expect(r.auditKetting[0].besluit.beslissing).toBe("autonoom");
    expect(r.auditKetting[0].uitvoerder).toBe("notary-ai");
  });

  it("een ambtelijke handeling wordt verboden en nooit uitgevoerd", async () => {
    const c = maakMockConnector("registratie", "formaliteit");
    const regel: AutonomieRegel = { handelingstype: "verlijden", tier: "ambtelijk", impact: "hoog", autonoomToegestaan: true, minimumNiveau: "zeker" };
    const r = await voerUitMetPoort({
      connector: c,
      aanvraag: aanvraag({ dienst: "registratie" }),
      regel,
      zekerheid: zeker,
      auditKetting: [],
      dossierRef: "dossier-1",
      tijdstip: "2026-07-05T11:37:00.000Z",
    });
    expect(r.uitkomst).toBe("verboden");
    expect(r.antwoord).toBeUndefined();
  });
});
