import { describe, expect, it } from "vitest";
import { ALLE_DIENSTEN, DIENST_IMPACT, type Connector, type ConnectorRegistratie } from "./connector";
import { seedAdapters } from "./adapters";
import { aangeslotenDiensten, connectorVoorDienst } from "./register";

describe("adapterregister (AUT-F4)", () => {
  it("bedient elke gekende dienst met minstens de mock-adapter, met de contractuele impact", () => {
    for (const dienst of ALLE_DIENSTEN) {
      const connector = connectorVoorDienst(dienst);
      expect(connector, `dienst "${dienst}" heeft geen adapter`).toBeDefined();
      expect(connector!.dienst).toBe(dienst);
      expect(connector!.impact).toBe(DIENST_IMPACT[dienst]);
    }
    expect(new Set(aangeslotenDiensten())).toEqual(new Set(ALLE_DIENSTEN));
  });

  it("laat een echte adapter primeren op de mock van dezelfde dienst", () => {
    const echte: Connector = {
      dienst: "bodemattest",
      impact: "opzoeking",
      async voerUit() {
        return { status: "ok", resultaat: { van: "echte-api" }, herhaald: false };
      },
    };
    const registraties: ConnectorRegistratie[] = [...seedAdapters, { connector: echte, soort: "echt" }];
    expect(connectorVoorDienst("bodemattest", registraties)).toBe(echte);
    // De overige diensten blijven op hun mock terugvallen.
    expect(connectorVoorDienst("registratie", registraties)?.impact).toBe("formaliteit");
    expect(aangeslotenDiensten(registraties, "echt")).toEqual(["bodemattest"]);
  });

  it("geeft undefined voor een dienst zonder enige adapter", () => {
    expect(connectorVoorDienst("bodemattest", [])).toBeUndefined();
    expect(aangeslotenDiensten([])).toEqual([]);
  });

  it("mock-adapters antwoorden effectief uit de fixtures (steekproef, met idempotentie)", async () => {
    const connector = connectorVoorDienst("bodemattest")!;
    const aanvraag = { dienst: "bodemattest" as const, idempotentiesleutel: "test-1", payload: {} };
    const eerste = await connector.voerUit(aanvraag);
    expect(eerste.status).toBe("ok");
    const tweede = await connector.voerUit(aanvraag);
    expect(tweede).toMatchObject({ status: "ok", herhaald: true });
  });
});
