/* global fetch */

const LOCAL_LABEL_PRINT_AGENT_BASE_URL = 'http://127.0.0.1:9888';
const LOCAL_LABEL_PRINT_AGENT_UNAVAILABLE_MESSAGE =
  'Printer agent not running. Start the local GP-2120T print service.';

function getPacketUniqueCode(packet) {
  return String(packet?.uniquePacketId || packet?.marinatedPacketId || '').trim();
}

function formatLocalLabelDateTime(iso) {
  if (!iso) return '';
  const date = new Date(iso);
  if (Number.isNaN(date.getTime())) return '';
  const dd = String(date.getDate()).padStart(2, '0');
  const mm = String(date.getMonth() + 1).padStart(2, '0');
  const hh = String(date.getHours()).padStart(2, '0');
  const min = String(date.getMinutes()).padStart(2, '0');
  return `${dd}/${mm} ${hh}:${min}`;
}

function makeLocalLabelPrintPayload(packet) {
  const uniqueCode = getPacketUniqueCode(packet);
  const qrPayload = String(packet?.overrideCode || uniqueCode).trim().toUpperCase();
  if (!uniqueCode) {
    throw new Error('Cannot print a label without a unique packet code.');
  }

  return {
    unique_code: qrPayload,
    sku_name: packet?.skuName || '',
    override_number: packet?.overrideCode || uniqueCode.slice(-8).toUpperCase(),
    packet_count: Number(packet?.packetCount || packet?.totalPacketCount || 1),
    make_value: formatLocalLabelDateTime(packet?.makeAt || packet?.mrdStartAt || packet?.createdAt),
    ready_value: formatLocalLabelDateTime(packet?.readyAt || packet?.makeAt || packet?.mrdStartAt || packet?.createdAt),
    discard_value: formatLocalLabelDateTime(packet?.discardAt),
  };
}

async function printPacketLabelViaLocalAgent(packet) {
  let response;
  try {
    response = await fetch(`${LOCAL_LABEL_PRINT_AGENT_BASE_URL}/print/label`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(makeLocalLabelPrintPayload(packet)),
    });
  } catch (error) {
    throw new Error(LOCAL_LABEL_PRINT_AGENT_UNAVAILABLE_MESSAGE);
  }

  let payload = null;
  try {
    payload = await response.json();
  } catch (error) {}

  if (!response.ok) {
    throw new Error(payload?.detail || payload?.message || `Label print failed (${response.status}).`);
  }

  return payload || { ok: true };
}

Object.assign(window, {
  LOCAL_LABEL_PRINT_AGENT_UNAVAILABLE_MESSAGE,
  printPacketLabelViaLocalAgent,
});
