import {
  Document,
  Packer,
  Paragraph,
  TextRun,
  HeadingLevel,
  AlignmentType,
} from "docx";

export type DownloadFormaat = "md" | "txt" | "docx";

function basisNaam(bestandsnaam: string): string {
  return bestandsnaam.replace(/\.[^.]+$/, "");
}

function downloadBlob(blob: Blob, bestandsnaam: string) {
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = bestandsnaam;
  a.click();
  URL.revokeObjectURL(url);
}

function markdownNaarParagrafen(tekst: string): Paragraph[] {
  return tekst.split("\n").map((regel) => {
    if (/^### /.test(regel)) {
      return new Paragraph({
        text: regel.slice(4),
        heading: HeadingLevel.HEADING_3,
      });
    }
    if (/^## /.test(regel)) {
      return new Paragraph({
        text: regel.slice(3),
        heading: HeadingLevel.HEADING_2,
      });
    }
    if (/^# /.test(regel)) {
      return new Paragraph({
        text: regel.slice(2),
        heading: HeadingLevel.HEADING_1,
      });
    }
    if (regel.trim() === "") {
      return new Paragraph({ text: "" });
    }
    return new Paragraph({
      alignment: AlignmentType.LEFT,
      children: [new TextRun({ text: regel, size: 22 })],
    });
  });
}

export async function downloadAanvullendBestand(
  bestandsnaam: string,
  inhoud: string,
  formaat: DownloadFormaat
): Promise<void> {
  const basis = basisNaam(bestandsnaam);

  if (formaat === "md") {
    downloadBlob(
      new Blob([inhoud], { type: "text/markdown;charset=utf-8" }),
      `${basis}.md`
    );
    return;
  }

  if (formaat === "txt") {
    downloadBlob(
      new Blob([inhoud], { type: "text/plain;charset=utf-8" }),
      `${basis}.txt`
    );
    return;
  }

  // docx
  const doc = new Document({
    sections: [
      {
        children: markdownNaarParagrafen(inhoud),
      },
    ],
  });
  const blob = await Packer.toBlob(doc);
  downloadBlob(blob, `${basis}.docx`);
}
