// ── Gedeelde leveringsmechaniek voor gegenereerde .docx-bestanden ────────────
// De Word-routes (/api/modeldocumenten/[id]/word en /api/dossier/word) leveren
// hun bestand op identiek dezelfde manier af: kortstondig bewaren
// (bestandenCache) achter een downloadUrl, de notaris verwittigen, en het
// bestand enkel als base64 meesturen wanneer het klein genoeg is. Eén module
// zodat de drempel, de mechaniek en de agent-instructie nooit uiteenlopen.

import { bewaarBestand } from "./bestandenCache";
import { meldGegenereerdBestand } from "@/lib/mail/stuurMail";
import { naAntwoord } from "@/lib/naAntwoord";

/**
 * Boven deze grootte (bytes) sturen we het .docx niet als base64 mee, maar
 * enkel als downloadUrl. Base64 verdrievoudigt de payload in tekens, en een
 * chatgeoriënteerde orchestrator (bv. Copilot Studio) moet dat na de
 * tool-aanroep nog in zijn eigen antwoord verwerken — ook als de tool-aanroep
 * zelf slaagt (isError: false), kan die stap alsnog vastlopen op de omvang
 * (een generieke "SystemError", zonder duidelijke oorzaak in de tool-respons
 * zelf). 256.000 bytes bleek in de praktijk nog te groot; ruim verlaagd.
 */
export const MAX_BASE64_BYTES = 40_000;

export const WORD_MIME_TYPE =
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

/** De leveringsvelden die elke Word-route in haar JSON-antwoord opneemt. */
export interface WordLevering {
  bestandsnaam: string;
  mimeType: typeof WORD_MIME_TYPE;
  /** Alleen gevuld wanneer het bestand ≤ MAX_BASE64_BYTES is; anders null. */
  base64: string | null;
  downloadUrl: string;
}

/**
 * Bewaart het gegenereerde .docx kortstondig achter een downloadUrl en bepaalt
 * of het klein genoeg is om als base64 mee te sturen. De notaris-notificatie
 * (e-mail via Resend) gebeurt via `naAntwoord()` — NA het versturen van het
 * antwoord, nooit ervoor: een chatgeoriënteerde orchestrator (bv. Copilot
 * Studio/MCP) wacht op déze aanroep terwijl de eindgebruiker live in de chat
 * zit, en heeft doorgaans een kortere timeout dan onze eigen 60 s interne
 * MCP-fetch-timeout (lib/mcp/server.ts). Een trage of tijdelijk onbereikbare
 * mailprovider mocht de bestandsgeneratie nooit laten mislukken (zie
 * stuurMail.ts), maar mag hem ook niet nodeloos VERTRAGEN tot voorbij die
 * externe timeout.
 */
export async function leverWordBestand(
  buffer: Buffer,
  bestandsnaam: string,
  request: Request
): Promise<WordLevering> {
  const token = await bewaarBestand(buffer, WORD_MIME_TYPE, bestandsnaam);
  const downloadUrl = new URL(`/api/bestanden/${token}`, request.url).toString();
  naAntwoord(() => meldGegenereerdBestand(bestandsnaam, downloadUrl));
  const base64 = buffer.length <= MAX_BASE64_BYTES ? buffer.toString("base64") : null;
  return { bestandsnaam, mimeType: WORD_MIME_TYPE, base64, downloadUrl };
}

/**
 * De agent-instructie over base64 versus downloadUrl, voor in de disclaimer
 * van het route-antwoord (eindigt op een spatie zodat de route er haar eigen
 * slotzin achter kan plakken).
 */
export function leveringsInstructie({ bestandsnaam, base64, downloadUrl }: WordLevering): string {
  return base64
    ? `Decodeer 'base64' lokaal naar een .docx, of deel anders 'downloadUrl' (24 uur geldig) als klikbare Markdown-link, bv. [${bestandsnaam}](${downloadUrl}) — nooit de kale URL als platte tekst. `
    : `Dit bestand is te groot om als 'base64' mee te sturen (base64 is null): deel 'downloadUrl' (24 uur geldig) als klikbare Markdown-link, bv. [${bestandsnaam}](${downloadUrl}) — nooit de kale URL als platte tekst; dat levert het echte .docx-bestand. `;
}
