/* Format helpers + data-source indicators */

window.fmtUSD = (n, frac = 0) => {
  const s = Math.abs(n) >= 1000
    ? n.toLocaleString('en-US', { maximumFractionDigits: frac, minimumFractionDigits: frac })
    : n.toFixed(2);
  return s;
};
window.fmtCompact = (n) => {
  const abs = Math.abs(n);
  if (abs >= 1e9) return (n / 1e9).toFixed(2) + 'B';
  if (abs >= 1e6) return (n / 1e6).toFixed(2) + 'M';
  if (abs >= 1e3) return (n / 1e3).toFixed(1) + 'K';
  return String(n);
};
window.fmtSigned = (n, d = 2) => (n >= 0 ? '+' : '') + n.toFixed(d);

/* DataTag — shows data source status in card headers
   src: 'live' | 'fallback' | 'mock'
   'live'     = real API, no meaningful fallback
   'fallback' = real API attempted; static/generated data used if it fails
   'mock'     = hardcoded / seeded / config-only data
*/
window.DataTag = function DataTag({ src }) {
  if (src === 'mock')     return <span className="chip mock">MOCK</span>;
  if (src === 'fallback') return <span className="chip fallback">LIVE ·?</span>;
  if (src === 'live')     return <span className="chip bull" style={{ fontSize: 9.5 }}>LIVE</span>;
  return null;
};

/* Wrap a card className with the border-accent class */
window.srcClass = (src) =>
  src === 'mock'     ? 'card src-mock'     :
  src === 'fallback' ? 'card src-fallback' :
  src === 'live'     ? 'card src-live'     : 'card';
