// ============================================================================
// Tags — Opsmera's LOCKED tag system.
//
// Three independent dimensions, each with its own visual language. Mixing them
// is what makes a UI feel busy. Every chip in the app MUST come from this file.
//
//   TRACK    (RAG of urgency/health)   ●  4 values, only place red/amber/green appear
//   PRIORITY (severity badge)          ●  P1..P4, separate from track
//   STAGE    (workflow position)       ●  neutral pill, distinguished by icon + word
//
// CANONICAL DICTIONARIES: status strings -> stage definitions. Don't invent
// new labels at the call site; add them here so the contract is enforceable.
// ============================================================================

const TRACK = {
  'on-track': { label: 'On track',  dot: 'on' },
  'at-risk':  { label: 'At risk',   dot: 'risk' },
  'breached': { label: 'Breached',  dot: 'breach' },
  'done':     { label: 'Done',      dot: 'done' },
};

const PRIO = {
  p1: { label: 'P1' },
  p2: { label: 'P2' },
  p3: { label: 'P3' },
  p4: { label: 'P4' },
};

// Stage dictionary by domain. Each entry: [label, icon].
const STAGE = {
  // tickets / intake
  inbox:       ['Inbox',          'inbox'],
  triaged:     ['Triaged',        'sparkles'],
  assigned:    ['Assigned',       'user-round-plus'],
  quoting:     ['Quoting',        'calculator'],
  approved:    ['Approved',       'check-check'],
  scheduled:   ['Scheduled',      'calendar'],
  'on-site':   ['On site',        'hard-hat'],
  signoff:     ['Sign-off',       'file-check'],
  closed:      ['Closed',         'archive'],
  // invoices
  awaiting:    ['Awaiting',       'hourglass'],
  paid:        ['Paid',           'banknote'],
  // comms
  draft:       ['Draft',          'pencil'],
  sending:     ['Sending',        'send'],
  delivered:   ['Delivered',      'check-check'],
  // motions / governance
  upcoming:    ['Upcoming',       'clock'],
  voting:      ['Voting open',    'gavel'],
  carried:     ['Carried',        'check'],
  defeated:    ['Defeated',       'x'],
  // committee workflow stages used by intake mocks
  committee:   ['With committee', 'users'],
  dispatching: ['Dispatching',    'truck'],
};

// Bridge from the legacy `status:` field on mock data to the new tag system.
// Lets us migrate without rewriting every record.
const STATUS_TO_TAG = {
  // intake
  'Deadline 2d':     { track: 'breached', sub: 'Deadline 2d' },
  'Deadline 1d':     { track: 'breached', sub: 'Deadline 1d' },
  'Quoting':         { stage: 'quoting' },
  'With committee':  { stage: 'committee' },
  'Dispatching':     { stage: 'dispatching' },
  'Closed':          { stage: 'closed' },
  // invoices
  'Awaiting':        { stage: 'awaiting' },
  'Approved':        { stage: 'approved' },
  'Paid':            { stage: 'paid' },
  'Overdue':         { track: 'breached', sub: 'Overdue' },
  // comms
  'Sending':         { stage: 'sending' },
  'AI nudge':        { stage: 'sending' },     // automation IS sending — same stage
  'Delivered':       { stage: 'delivered' },
  'Scheduled':       { stage: 'scheduled' },
  // building health
  'Healthy':         { track: 'on-track', sub: 'Healthy' },
  'Watch':           { track: 'at-risk',  sub: 'Watch' },
  'At risk':         { track: 'breached', sub: 'At risk' },
};

// ----- The components ------------------------------------------------------

// <Tag track="on-track|at-risk|breached|done">  — RAG urgency rail
function Tag({ track, prio, stage, children, sub }) {
  if (track) {
    const t = TRACK[track];
    return (
      <span className={`tag tag-track track-${track}`}>
        <span className="tag-dot" />{sub || (children ?? t.label)}
      </span>
    );
  }
  if (prio) {
    return <span className={`tag tag-prio prio-${prio}`}>{children || PRIO[prio]?.label}</span>;
  }
  if (stage) {
    const s = STAGE[stage] || [stage, 'circle'];
    return (
      <span className="tag tag-stage">
        <Icon name={s[1]} />{children || s[0]}
      </span>
    );
  }
  // fallback: a plain neutral label
  return <span className="tag tag-stage">{children}</span>;
}

// Helper: render the right Tag from a legacy `statusLabel` string.
function TagFromStatus({ status }) {
  const m = STATUS_TO_TAG[status];
  if (!m) return <span className="tag tag-stage">{status}</span>;
  if (m.track) return <Tag track={m.track} sub={m.sub} />;
  if (m.stage) return <Tag stage={m.stage} />;
  return <span className="tag tag-stage">{status}</span>;
}

Object.assign(window, { Tag, TagFromStatus, TRACK, PRIO, STAGE, STATUS_TO_TAG });
