/* global window */
/*
 * Shared queue-contract helpers for the ops queue payload
 * (GET /api/ops/queue). Loaded once before the screen bundles.
 *
 * These used to be duplicated verbatim in screens-today.jsx and
 * screens-ops.jsx. Because every text/babel script executes in the
 * global scope, the later copy silently overwrote the earlier one -
 * the app only worked because the copies were identical. This module
 * is now the single owner; screens must not redefine these names.
 */

function normalizeQueuePriority(priority) {
  const raw = String(priority || '').toUpperCase();
  if (['P0', 'P1', 'P2', 'P3'].includes(raw)) return raw;
  if (raw === 'CRITICAL') return 'P0';
  if (raw === 'HIGH') return 'P1';
  if (raw === 'MEDIUM') return 'P2';
  return 'P3';
}

function formatQueueUpdatedAt(value) {
  if (!value) return '—';
  const parsed = new Date(value);
  if (Number.isNaN(parsed.getTime())) return String(value);
  return parsed.toLocaleString('et-EE', { day:'2-digit', month:'2-digit', hour:'2-digit', minute:'2-digit' });
}

function getQueueItems(opsQueue) {
  return Array.isArray(opsQueue?.data?.items) ? opsQueue.data.items : [];
}

function isMalformedQueue(opsQueue) {
  return Boolean(opsQueue?.data && !Array.isArray(opsQueue.data.items));
}

function getQueueMeta(opsQueue, opsError) {
  if (opsError) {
    return { ok:false, label:'Viga', tone:'danger', fresh:'missing', detail:opsError.message || 'backend queue päring ebaõnnestus' };
  }
  if (!opsQueue) {
    return { ok:false, label:'Laeb', tone:'warn', fresh:'missing', detail:'backend queue laeb' };
  }
  if (window.OpsProvenance.isMissing(opsQueue)) {
    return { ok:false, label:'Puudub', tone:'danger', fresh:'missing', detail:opsQueue.provenance.detail || 'backend queue allikas puudub' };
  }
  if (isMalformedQueue(opsQueue)) {
    return { ok:false, label:'Vigane kuju', tone:'danger', fresh:'missing', detail:'backend queue items ei ole massiiv' };
  }
  if (window.OpsProvenance.isPartialLive(opsQueue)) {
    return { ok:true, label:'Osaliselt live', tone:'warn', fresh:'stale', detail:opsQueue.provenance.detail || 'backend queue on osaline' };
  }
  return { ok:true, label:'Live', tone:'', fresh:'live', detail:'backend queue' };
}

window.OpsQueueContract = {
  normalizeQueuePriority,
  formatQueueUpdatedAt,
  getQueueItems,
  isMalformedQueue,
  getQueueMeta,
};
