import { formatInvoiceDate, formatMoney, type Invoice, invoiceTotal, } from "@/lib/invoices"; function esc(value: string): string { return value .replace(/&/g, "&") .replace(//g, ">"); } // Render an invoice into a clean, print-styled document in a new window and // trigger the browser's print dialog, where the clinician can "Save as PDF". // Dependency-free — no PDF library needed; swap for jsPDF later if a generated // file is required. export function downloadInvoicePdf(invoice: Invoice, clinicName = "temetro") { const win = window.open("", "_blank", "width=820,height=1040"); if (!win) return; const total = invoiceTotal(invoice); const lineRows = invoice.lineItems .map( (li) => ` ${esc(li.description)} ${li.quantity} ${formatMoney(li.unitPrice)} ${formatMoney(li.quantity * li.unitPrice)} `, ) .join(""); const installmentRows = invoice.installments.length ? `

Installments

${invoice.installments .map( (it) => ``, ) .join("")}
InstallmentDueAmountStatus
${esc(it.label)} ${it.dueAt ? formatInvoiceDate(it.dueAt) : "—"} ${formatMoney(it.amount)} ${it.paid ? "Paid" : "Unpaid"}
` : ""; const notes = invoice.notes ? `

Notes

${esc(invoice.notes)}

` : ""; win.document.write(` ${esc(invoice.number)}

${esc(clinicName)}

Invoice
${esc(invoice.number)}
Issued ${formatInvoiceDate(invoice.issuedAt)}
${invoice.dueAt ? `
Due ${formatInvoiceDate(invoice.dueAt)}
` : ""}
Status: ${esc(invoice.status)}
Bill to: ${esc(invoice.name)}${invoice.fileNumber ? ` · File #${esc(invoice.fileNumber)}` : ""}

Line items

${lineRows || ``}
DescriptionQtyUnit priceAmount
No line items
Total${formatMoney(total)}
${installmentRows} ${notes} `); win.document.close(); }