import { describe, it, expect } from "vitest";
import JSZip from "jszip";
import { GET } from "./route";
import { haalBestand } from "@/lib/word/bestandenCache";

const MODEL_ID = "verkoopovereenkomst-compromis";

function maakRequest(query = ""): Request {
  return new Request(`http://localhost/api/modeldocumenten/${MODEL_ID}/word${query}`);
}

function maakParams(id = MODEL_ID): { params: Promise<{ id: string }> } {
  return { params: Promise.resolve({ id }) };
}

describe("GET /api/modeldocumenten/[id]/word", () => {
  it("levert een .docx-bestand op (als base64 en/of downloadUrl)", async () => {
    const res = await GET(
      maakRequest("?prijs_letters=DRIEHONDERDDUIZEND&prijs_cijfers=300000"),
      maakParams()
    );
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.bestandsnaam).toContain("(nai)");
    expect(json.bestandsnaam.endsWith(".docx")).toBe(true);
    expect(json.mimeType).toBe(
      "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    );
    // De base64-drempel is bewust laag (zie MAX_BASE64_BYTES in route.ts): een
    // chatgeoriënteerde orchestrator (bv. Copilot Studio) kan zelfs bij een
    // geslaagde tool-aanroep alsnog vastlopen op een te grote payload in zijn
    // eigen antwoord-synthese. Dit .docx is realistisch (media, stijlen) dus
    // meestal groter dan de drempel; haal de buffer in dat geval via downloadUrl.
    const token = json.downloadUrl.split("/").pop();
    const buffer = json.base64 ? Buffer.from(json.base64, "base64") : (await haalBestand(token))!.buffer;
    // .docx is een ZIP-bestand: begint met de PK-magicbytes.
    expect(buffer.subarray(0, 2).toString("latin1")).toBe("PK");
    expect(json.disclaimer).toMatch(/[Ww]erkdocument/);
  });

  it("404 bij onbekend model-id", async () => {
    const res = await GET(maakRequest(), maakParams("bestaat-niet"));
    expect(res.status).toBe(404);
  });

  it("met facultatief=...: het facultatieve onderdeel komt mee in opgenomenFacultatief", async () => {
    const onderdeelId = "roerende-goederen-zonnepanelen";
    const res = await GET(maakRequest(`?facultatief=${onderdeelId}`), maakParams());
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.opgenomenFacultatief).toContain(onderdeelId);
    expect(json.genegeerdFacultatief).toEqual([]);
  });

  it("heldere-taal-compromis: het informatieve vak toont de VOLLEDIGE identiteit, niet enkel de beknopte naam", async () => {
    const res = await GET(
      maakRequest(
        "?naam_verkoper=Jan+Peeters&identiteit_verkopers=" +
          encodeURIComponent(
            "De heer PEETERS Jan, geboren te Mechelen op 20 februari 1965, ingeschreven in het rijksregister onder nummer [AAN TE VULLEN: rijksregisternummer], echtgeno(o)t(e) van [AAN TE VULLEN: naam_echtgenoot], wonende te Kerkstraat 8.\n\ngehuwd te [AAN TE VULLEN: plaats_huwelijk] onder het stelsel van scheiding van goederen, zoals hij verklaart."
          )
      ),
      maakParams("verkoopovereenkomst-heldere-taal")
    );
    expect(res.status).toBe(200);
    const json = await res.json();
    // Het sjabloon-.docx is groter dan de base64-drempel; haal de buffer in
    // dat geval rechtstreeks uit de bestandencache (via de downloadUrl-token).
    const token = json.downloadUrl.split("/").pop();
    const buffer = json.base64 ? Buffer.from(json.base64, "base64") : (await haalBestand(token))!.buffer;
    const zip = await JSZip.loadAsync(buffer);
    const documentXml = await zip.file("word/document.xml")!.async("string");
    // Het vak toont de volledige identiteitsclausule (geboorteplaats/-datum, …),
    // niet enkel de beknopte naam "Jan Peeters".
    expect(documentXml.indexOf("Jan Peeters")).toBe(-1);
    const idx = documentXml.indexOf("Mechelen");
    expect(idx).toBeGreaterThan(-1);
    expect(documentXml).toContain("wonende te Kerkstraat 8");
  });

  it("authentieke akte (bv. verkoopakte-woning): gebruikt het kantoorsjabloon voor aktes, geen sjabloon-ellips meer", async () => {
    const res = await GET(maakRequest(), maakParams("verkoopakte-woning"));
    expect(res.status).toBe(200);
    const json = await res.json();
    const token = json.downloadUrl.split("/").pop();
    const buffer = json.base64 ? Buffer.from(json.base64, "base64") : (await haalBestand(token))!.buffer;
    const zip = await JSZip.loadAsync(buffer);
    const documentXml = await zip.file("word/document.xml")!.async("string");
    const styles = await zip.file("word/styles.xml")!.async("string");
    expect(styles).toContain('"Tabelraster"');
    expect(documentXml).toContain("VERKOOPAKTE ONROEREND GOED");
    expect(documentXml).not.toMatch(/<w:t[^>]*>…<\/w:t>/);
  });
});
