/**
 * ZPL label builders for Zebra printers (4x6 inch at 203 dpi = 812 x 1218 dots).
 * Returned as plain text so the RF app can send it to a networked printer or
 * the browser print bridge. Code 128 barcodes are used for LPN / carton numbers.
 */
const esc = (v: string | undefined) => (v ?? '').replace(/[\^~]/g, ' ').slice(0, 40);

export function buildLpnLabelZpl(i: { lpnNumber: string; storerName?: string; skuCode?: string; description?: string; qty?: string; lot?: string; expiry?: string; asnNumber?: string }): string {
  return [
    '^XA', '^CI28', '^PW812', '^LL1218', '^LH0,0',
    `^FO30,30^A0N,40,40^FD${esc(i.storerName)}^FS`,
    `^FO30,90^A0N,30,30^FDASN: ${esc(i.asnNumber)}^FS`,
    '^FO30,140^GB752,3,3^FS',
    `^FO30,170^A0N,36,36^FDSKU: ${esc(i.skuCode)}^FS`,
    `^FO30,220^A0N,28,28^FD${esc(i.description)}^FS`,
    `^FO30,270^A0N,30,30^FDQTY: ${esc(i.qty)}   LOT: ${esc(i.lot)}^FS`,
    `^FO30,320^A0N,30,30^FDEXP: ${esc(i.expiry)}^FS`,
    '^FO30,380^GB752,3,3^FS',
    `^FO60,430^BY4,3,220^BCN,220,Y,N,N^FD${esc(i.lpnNumber)}^FS`,
    `^FO30,720^A0N,60,60^FD${esc(i.lpnNumber)}^FS`,
    '^XZ',
  ].join('\n');
}

export function buildCartonLabelZpl(i: { cartonNumber: string; orderNumber: string; shipToName?: string; address?: string; cartonIndex?: number; cartonCount?: number; carrier?: string; trackingNo?: string }): string {
  return [
    '^XA', '^CI28', '^PW812', '^LL1218', '^LH0,0',
    `^FO30,30^A0N,40,40^FDSHIP TO:^FS`,
    `^FO30,80^A0N,44,44^FD${esc(i.shipToName)}^FS`,
    `^FO30,135^A0N,28,28^FD${esc(i.address)}^FS`,
    '^FO30,190^GB752,3,3^FS',
    `^FO30,220^A0N,34,34^FDORDER: ${esc(i.orderNumber)}^FS`,
    `^FO30,270^A0N,30,30^FDCARRIER: ${esc(i.carrier)}  ${i.trackingNo ? 'TRK: ' + esc(i.trackingNo) : ''}^FS`,
    `^FO30,320^A0N,30,30^FDCARTON ${i.cartonIndex ?? ''} OF ${i.cartonCount ?? ''}^FS`,
    '^FO30,380^GB752,3,3^FS',
    `^FO60,430^BY4,3,220^BCN,220,Y,N,N^FD${esc(i.cartonNumber)}^FS`,
    `^FO30,720^A0N,50,50^FD${esc(i.cartonNumber)}^FS`,
    '^XZ',
  ].join('\n');
}

export function buildLocationLabelZpl(code: string, checkDigit?: string): string {
  return ['^XA', '^CI28', '^PW812', '^LL406', `^FO40,30^BY4,3,160^BCN,160,N,N,N^FD${esc(code)}^FS`, `^FO40,220^A0N,70,70^FD${esc(code)}^FS`, checkDigit ? `^FO600,220^A0N,70,70^FD${esc(checkDigit)}^FS` : '', '^XZ'].filter(Boolean).join('\n');
}
