// Shared utility helpers
const fmt = {
  money(n, compact = false) {
    if (n == null || isNaN(n)) return '—';
    const neg = n < 0;
    const a = Math.abs(n);
    let s;
    if (compact && a >= 1000) {
      if (a >= 1e6) s = '$' + (a / 1e6).toFixed(1).replace(/\.0$/, '') + 'M';
      else s = '$' + (a / 1000).toFixed(a % 1000 === 0 ? 0 : 1).replace(/\.0$/, '') + 'k';
    } else {
      s = '$' + a.toLocaleString('en-AU', { maximumFractionDigits: 0 });
    }
    return neg ? '(' + s + ')' : s;
  },
  num(n) {
    const v = n || 0;
    const s = Math.abs(v).toLocaleString();
    return v < 0 ? '(' + s + ')' : s;
  },
  pct(n, d = 0) {
    const v = (n || 0) * 100;
    const s = Math.abs(v).toFixed(d) + '%';
    return v < 0 ? '(' + s + ')' : s;
  },
  daysAgo(n) {
    if (n === 0) return 'today';
    if (n === 1) return 'yesterday';
    if (n < 7) return n + 'd ago';
    if (n < 30) return Math.floor(n / 7) + 'w ago';
    return Math.floor(n / 30) + 'mo ago';
  },
  shortDate(s) {
    if (!s) return '—';
    const d = new Date(s);
    return d.toLocaleDateString('en-AU', { day: 'numeric', month: 'short' });
  },
  initialsOf(name) {
    return name.split(' ').map(s => s[0]).slice(0, 2).join('').toUpperCase();
  },
};

function ageBucket(days) {
  if (days <= 7) return 'fresh';
  if (days <= 21) return 'warm';
  return 'hot';
}

function StagePill({ stage, stages }) {
  const meta = stages.find(s => s.id === stage);
  return (
    <span className="pill stage-pill" data-stage={stage}>
      <span className="dot"></span>
      {meta ? meta.label : stage}
    </span>
  );
}

function Avatar({ name, sz = 'md' }) {
  const cls = sz === 'sm' ? 'avatar sm' : sz === 'lg' ? 'avatar lg' : 'avatar';
  const initials = fmt.initialsOf(name);
  // deterministic color by initial
  const h = (initials.charCodeAt(0) * 13 + (initials.charCodeAt(1) || 0) * 7) % 360;
  const bg = `oklch(0.45 0.08 ${h})`;
  return <span className={cls} style={{ background: bg }}>{initials}</span>;
}

window.fmt = fmt;
window.ageBucket = ageBucket;
window.StagePill = StagePill;
window.Avatar = Avatar;
