// ── 'Wijzigingen bijhouden' forceren op een gegenereerd .docx-bestand ────────
// De docx-bibliotheek (`features: { trackRevisions: true }`) schrijft een
// niet-bestaand OOXML-element ("w:trackRevisions") naar settings.xml — Word
// negeert dat stilzwijgend, waardoor 'Wijzigingen bijhouden' bij het openen
// NIET aanstaat, ondanks de intentie in de code. Het echte OOXML-element is
// "w:trackChanges" (zie officeopenxml.com/WPtrackChanges.php). Deze helper
// herschrijft settings.xml na het genereren, zodat elk .docx dat de notaris/
// agent ontvangt effectief met 'Wijzigingen bijhouden' aan opent.

import JSZip from "jszip";

/**
 * Herschrijft de settings-XML zodat `<w:trackChanges/>` actief is en de
 * onwerkzame `w:trackRevisions`-marker verdwijnt. `null` = onverwachte
 * structuur, laat het bestand ongemoeid.
 */
function herschrijfSettingsXml(settings: string): string | null {
  // De onwerkzame marker van de docx-bibliotheek weghalen (geen effect in
  // Word; laten staan zou een actief lijkende, maar dode instelling tonen).
  let uit = settings.replace(/<w:trackRevisions\b[^>]*\/>/, "");

  if (/<w:trackChanges\b[^>]*\/>/.test(uit)) {
    uit = uit.replace(/<w:trackChanges\b[^>]*\/>/, "<w:trackChanges/>");
  } else if (/<w:settings\b[^>]*>/.test(uit)) {
    uit = uit.replace(/(<w:settings\b[^>]*>)/, `$1<w:trackChanges/>`);
  } else {
    return null;
  }
  return uit;
}

async function forceerInZip(zip: JSZip): Promise<boolean> {
  const settingsBestand = zip.file("word/settings.xml");
  if (!settingsBestand) return false;
  const herschreven = herschrijfSettingsXml(await settingsBestand.async("string"));
  if (herschreven === null) return false;
  zip.file("word/settings.xml", herschreven);
  return true;
}

/**
 * Forceert `<w:trackChanges/>` in word/settings.xml van een reeds
 * gegenereerd .docx-bestand (buffer in, buffer uit). Ruimt de onwerkzame
 * `w:trackRevisions`-marker van de docx-bibliotheek op. Onverwachte
 * bestandsstructuur (geen settings.xml) → de buffer ongewijzigd teruggeven.
 */
export async function forceerTrackChanges(buffer: Buffer): Promise<Buffer> {
  const zip = await JSZip.loadAsync(buffer);
  if (!(await forceerInZip(zip))) return buffer;
  // DEFLATE expliciet opgeven: JSZip valt anders terug op ongecomprimeerd
  // (STORE), wat het bestand nodeloos meerdere keren groter maakt.
  return zip.generateAsync({ type: "nodebuffer", compression: "DEFLATE" });
}

/**
 * Browser-variant van `forceerTrackChanges` (Blob in, Blob uit) voor client
 * components die een .docx via `Packer.toBlob` genereren en meteen laten
 * downloaden — `type: "nodebuffer"` bestaat niet in de browser.
 */
export async function forceerTrackChangesBlob(blob: Blob): Promise<Blob> {
  const zip = await JSZip.loadAsync(await blob.arrayBuffer());
  if (!(await forceerInZip(zip))) return blob;
  return zip.generateAsync({ type: "blob", compression: "DEFLATE" });
}
