// Rechnung als echte PDF-Datei herunterladen — komplett clientseitig mit jsPDF + jspdf-autotable
// (beide MIT-lizenziert, siehe package.json), kein Backend nötig. Beide Bibliotheken werden per
// dynamic import() erst beim tatsächlichen Klick nachgeladen (Code-Splitting) — auf den ersten
// Seitenaufruf hat das also keinen Einfluss, nur wer wirklich herunterlädt lädt die ~230 KB nach.
// Spiegelt bewusst 1:1 dieselben Daten wie die Ansicht im <dialog> (siehe konto/angemeldet.astro),
// damit "Rechnung ansehen" und "Rechnung downloaden" nie auseinanderlaufen.

import { formatPrice } from "../i18n/format";
import type { Locale } from "../i18n/config";

export interface RechnungArtikel {
  name: string;
  menge: number;
  preis: number;
}

export interface RechnungLabels {
  title: string;
  numberLabel: string;
  dateLabel: string;
  sellerLabel: string;
  billToLabel: string;
  itemLabel: string;
  qtyLabel: string;
  unitPriceLabel: string;
  sumLabel: string;
  totalLabel: string;
  vatNote: string;
}

export interface RechnungDaten {
  nummer: string;
  datum: string;
  artikel: RechnungArtikel[];
  summe: number;
  empfaenger: string;
  lang: Locale;
  labels: RechnungLabels;
}

export async function rechnungAlsPdfHerunterladen(daten: RechnungDaten): Promise<void> {
  const [{ default: JsPDF }, autoTableModule] = await Promise.all([
    import("jspdf"),
    import("jspdf-autotable"),
  ]);
  const autoTable = autoTableModule.default;

  const doc = new JsPDF({ unit: "mm", format: "a4" });
  const marginX = 18;
  let y = 22;

  // Kopf: Shop-Name groß, Rechnungstitel + Metadaten rechtsbündig daneben.
  doc.setFont("helvetica", "bold");
  doc.setFontSize(18);
  doc.text("Van's DIY & Bastelbedarf", marginX, y);

  doc.setFontSize(20);
  doc.text(daten.labels.title, 210 - marginX, y, { align: "right" });

  y += 8;
  doc.setFont("helvetica", "normal");
  doc.setFontSize(10);
  doc.setTextColor(90, 90, 90);
  doc.text(`${daten.labels.numberLabel}: ${daten.nummer}`, 210 - marginX, y, { align: "right" });
  y += 5;
  doc.text(`${daten.labels.dateLabel}: ${daten.datum}`, 210 - marginX, y, { align: "right" });

  // Verkäufer / Rechnungsempfänger nebeneinander.
  y += 14;
  doc.setTextColor(20, 20, 20);
  doc.setFont("helvetica", "bold");
  doc.setFontSize(9);
  doc.text(daten.labels.sellerLabel.toUpperCase(), marginX, y);
  doc.text(daten.labels.billToLabel.toUpperCase(), marginX + 95, y);

  y += 5;
  doc.setFont("helvetica", "normal");
  doc.setFontSize(10.5);
  doc.text("Van's DIY & Bastelbedarf", marginX, y);
  const empfaengerZeilen = [daten.empfaenger, "Musterstraße 1", "10115 Berlin", "Deutschland"];
  empfaengerZeilen.forEach((zeile, i) => doc.text(zeile, marginX + 95, y + i * 5));

  // Artikeltabelle.
  y += empfaengerZeilen.length * 5 + 10;
  autoTable(doc, {
    startY: y,
    head: [[daten.labels.itemLabel, daten.labels.qtyLabel, daten.labels.unitPriceLabel, daten.labels.sumLabel]],
    body: daten.artikel.map((a) => [
      a.name,
      String(a.menge),
      formatPrice(a.preis, daten.lang),
      formatPrice(a.preis * a.menge, daten.lang),
    ]),
    foot: [["", "", daten.labels.totalLabel, formatPrice(daten.summe, daten.lang)]],
    theme: "plain",
    margin: { left: marginX, right: marginX },
    styles: { font: "helvetica", fontSize: 10, cellPadding: { top: 2.5, bottom: 2.5, left: 2, right: 2 } },
    headStyles: { fontStyle: "bold", textColor: [110, 110, 110], fontSize: 8.5, lineWidth: { bottom: 0.4 }, lineColor: [200, 200, 200] },
    footStyles: { fontStyle: "bold", textColor: [20, 20, 20], fontSize: 11.5, lineWidth: { top: 0.4 }, lineColor: [200, 200, 200] },
    columnStyles: {
      1: { halign: "right" },
      2: { halign: "right" },
      3: { halign: "right" },
    },
  });

  // §19-UStG-Hinweis unter der Tabelle.
  // @ts-expect-error — lastAutoTable wird vom autoTable-Plugin zur Laufzeit an doc angehängt.
  const endY = doc.lastAutoTable.finalY as number;
  doc.setFontSize(9);
  doc.setTextColor(120, 120, 120);
  doc.text(daten.labels.vatNote, marginX, endY + 10);

  doc.save(`Rechnung-${daten.nummer}.pdf`);
}
