import { describe, it, expect } from "vitest";
// ── Sessie-ontwerptekst: bekijken en rechtstreeks bewerken ───────────────────
// Bewaakt de documentvenster-lus van het samengevoegde dossierscherm:
// (1) GET reconstrueert de ontwerptekst uit de bewaarde sessie-invoer met
//     dezelfde motor als de Word-generatie;
// (2) POST bewaart een rechtstreeks bewerkte tekst, rendert er een .docx van
//     en de volgende GET toont de bewerkte versie;
// (3) een latere parameter-regeneratie maakt de bewerking "verouderd" — de
//     GET valt terug op de reconstructie en meldt de oudere bewerking.
import { POST as genereerWerkdossier } from "@/app/api/dossier/word/route";
import { POST as regenereerViaParameters } from "../route";
import { GET as haalTekst, POST as bewaarTekst } from "./route";
import { haalBestand } from "@/lib/word/bestandenCache";

const MODEL_ID = "verkoopovereenkomst-compromis";

function wordRequest(body: Record<string, unknown>): Request {
  return new Request("http://localhost/api/dossier/word", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });
}

function tekstRequest(token: string, body?: Record<string, unknown>): [Request, { params: Promise<{ token: string }> }] {
  return [
    new Request(`http://localhost/api/dossier/sessies/${token}/tekst`, {
      method: body ? "POST" : "GET",
      headers: { "Content-Type": "application/json" },
      ...(body ? { body: JSON.stringify(body) } : {}),
    }),
    { params: Promise.resolve({ token }) },
  ];
}

async function maakSessie(): Promise<string> {
  const res = await genereerWerkdossier(
    wordRequest({
      modeldocumentId: MODEL_ID,
      modeldocumentParametersJson: JSON.stringify({ prijs_cijfers: "312.345 euro" }),
    })
  );
  expect(res.status).toBe(200);
  return (await res.json()).dossierToken as string;
}

describe("GET /api/dossier/sessies/[token]/tekst", () => {
  it("reconstrueert de ontwerptekst uit de bewaarde invoer (zelfde motor als de Word-route)", async () => {
    const token = await maakSessie();
    const res = await haalTekst(...tekstRequest(token));
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.bron).toBe("gereconstrueerd");
    expect(json.taal).toBe("nl");
    expect(json.tekst).toContain("312.345 euro");
  });

  it("geeft 404 voor een onbekende sessie", async () => {
    const res = await haalTekst(...tekstRequest("bestaat-niet"));
    expect(res.status).toBe(404);
  });
});

describe("POST /api/dossier/sessies/[token]/tekst — bewerken en downloaden", () => {
  it("bewaart de bewerkte tekst, rendert een .docx en de volgende GET toont de bewerking", async () => {
    const token = await maakSessie();
    const bewerkt = "AANGEPASTE ONTWERPTEKST — proefwijziging door de notaris.";
    const res = await bewaarTekst(...tekstRequest(token, { tekst: bewerkt, wijziging: "clausule herschreven" }));
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.downloadUrl).toContain("/api/bestanden/");
    expect(json.toegepasteWijziging).toBe("clausule herschreven");

    // Het geleverde bestand bestaat echt en is een .docx.
    const bestandToken = (json.downloadUrl as string).split("/").pop()!;
    const bestand = await haalBestand(bestandToken);
    expect(bestand).toBeDefined();
    expect(bestand!.buffer.length).toBeGreaterThan(1000);

    const na = await (await haalTekst(...tekstRequest(token))).json();
    expect(na.bron).toBe("aangepast");
    expect(na.tekst).toBe(bewerkt);
  });

  it("weigert een lege tekst", async () => {
    const token = await maakSessie();
    const res = await bewaarTekst(...tekstRequest(token, { tekst: "   " }));
    expect(res.status).toBe(400);
  });

  it("een latere parameter-regeneratie maakt de bewerking verouderd (GET valt terug op de reconstructie)", async () => {
    const token = await maakSessie();
    await bewaarTekst(...tekstRequest(token, { tekst: "BEWERKTE VERSIE VÓÓR DE REGENERATIE" }));

    // Parameter-regeneratie via de bestaande sessieroute.
    const regen = await regenereerViaParameters(
      new Request(`http://localhost/api/dossier/sessies/${token}`, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ parameters: { voorschot_cijfers: "10.000 euro" }, wijziging: "voorschot toegevoegd" }),
      }),
      { params: Promise.resolve({ token }) }
    );
    expect(regen.status).toBe(200);

    const na = await (await haalTekst(...tekstRequest(token))).json();
    expect(na.bron).toBe("gereconstrueerd");
    expect(na.aangepasteTekstVerouderd).toBe(true);
    expect(na.tekst).not.toContain("BEWERKTE VERSIE");
  });
});
