/* ══════════════════════════════════════════════════════════════════
   ATLAS COCKPIT — SHARED UI PRIMITIVES
   ══════════════════════════════════════════════════════════════════ */

function Pill({ kind, cls: extra, children, dot }) {
  return React.createElement('span', { className: cls('pill', kind, extra) },
    dot && React.createElement('span', { className: 'pdot' }), children);
}
function StatusPill({ status }) {
  return React.createElement(Pill, { kind: status, dot: ['live','shipped','in-progress','active','blocked','greenlight-scoped','bounded-experiment','private-research-test','paused-validation'].includes(status) },
    window.ATLAS_STATUS[status] || status);
}
function LanePill({ lane }) {
  return React.createElement('span', { className: 'pill lane' }, window.ATLAS_LANES[lane] || lane);
}
function SevPill({ sev }) {
  return React.createElement('span', { className: cls('pill', 'sev-' + sev) }, sev + ' severity');
}
function Conf({ level }) {
  return React.createElement('span', { className: cls('conf', level), title: 'Confidence: ' + level },
    React.createElement('i'), React.createElement('i'), React.createElement('i'));
}
function ScoreRing({ score }) {
  const pct = Math.max(0, Math.min(100, score));
  const r = 18, c = 2 * Math.PI * r;
  const color = score >= 80 ? 'var(--accent)' : score >= 65 ? 'var(--success)' : score >= 55 ? 'var(--warning)' : 'var(--ink-faint)';
  return React.createElement('div', { className: 'idea-score-ring' },
    React.createElement('svg', { width: 42, height: 42, viewBox: '0 0 42 42', style: { position: 'absolute', transform: 'rotate(-90deg)' } },
      React.createElement('circle', { cx: 21, cy: 21, r, fill: 'none', stroke: 'var(--rule)', strokeWidth: 3 }),
      React.createElement('circle', { cx: 21, cy: 21, r, fill: 'none', stroke: color, strokeWidth: 3, strokeLinecap: 'round', strokeDasharray: c, strokeDashoffset: c * (1 - pct / 100) })
    ),
    React.createElement('span', { className: 'sv' }, score)
  );
}
function ProgressBar({ value, total }) {
  const pct = total ? Math.round((value / total) * 100) : 0;
  return React.createElement('div', { className: 'bar' },
    React.createElement('i', { className: pct === 100 ? 'full' : '', style: { width: pct + '%' } }));
}
function EmptyState({ icon = 'check', title, children, action }) {
  return React.createElement('div', { className: 'empty' },
    React.createElement(Icon, { name: icon, size: 30, className: 'eico' }),
    React.createElement('h4', null, title),
    children && React.createElement('p', null, children),
    action
  );
}
function NoteField({ store, id, placeholder }) {
  const [v, setV] = useState(() => loadNote(store, id));
  return React.createElement('textarea', {
    className: 'field', rows: 2, placeholder: placeholder || 'Notes…', value: v,
    onChange: e => setV(e.target.value),
    onBlur: e => saveNote(store, id, e.target.value)
  });
}

/* Editable currency / number cell used in finance + KPIs */
function EditableNum({ value, onSave, placeholder = '—', prefix = '$', width }) {
  const [editing, setEditing] = useState(false);
  const [draft, setDraft] = useState('');
  const ref = useRef(null);
  useEffect(() => { if (editing && ref.current) { ref.current.focus(); ref.current.select(); } }, [editing]);
  const commit = () => {
    const t = draft.trim().replace(/[$,]/g, '');
    if (t === '') onSave(null);
    else if (!Number.isNaN(Number(t))) onSave(Number(t));
    else toast.error('Not a number — value unchanged');
    setEditing(false);
  };
  if (editing) {
    return React.createElement('input', {
      ref, className: 'cell-edit', defaultValue: value == null ? '' : value, style: width ? { width } : null,
      onChange: e => setDraft(e.target.value),
      onBlur: commit,
      onKeyDown: e => { if (e.key === 'Enter') commit(); if (e.key === 'Escape') setEditing(false); }
    });
  }
  return React.createElement('button', {
    className: cls('cell-edit', value == null && 'placeholder'), style: width ? { width } : null,
    onClick: () => { setDraft(value == null ? '' : String(value)); setEditing(true); }
  }, value == null ? placeholder : (prefix === '$' ? fmt$(value) : value));
}

function RubricStrip({ rubric }) {
  const keys = window.ATLAS_DATA.rubricKeys || [];
  if (!rubric) {
    return React.createElement('div', { className: 'rubric' },
      React.createElement('span', { className: 'rubric-label' }, 'Rubric'),
      React.createElement('span', { className: 'rubric-sum unscored' }, 'unscored — orchestrator will populate'));
  }
  const MARK = { strong: '✓', weak: '~', fail: '✕' };
  const cells = keys.map(([k, label], i) => {
    const v = rubric[k];
    const c = v === 'strong' ? 'strong' : v === 'weak' ? 'weak' : v === 'fail' ? 'fail' : 'unscored';
    return React.createElement('span', { key: k, className: cls('rubric-cell', c), title: `Q${i + 1} ${label}: ${v || 'unscored'}` }, MARK[v] || '?');
  });
  const fails = keys.filter(([k]) => rubric[k] === 'fail').length;
  const weaks = keys.filter(([k]) => rubric[k] === 'weak').length;
  const strongs = keys.filter(([k]) => rubric[k] === 'strong').length;
  let sc = 'strong', txt = `${strongs}/${keys.length} strong`;
  if (fails > 0) { sc = 'fail'; txt = `${fails} fail · ${weaks} weak — validation required`; }
  else if (weaks >= 3) { sc = 'weak'; txt = `${weaks} weak — review before greenlight`; }
  return React.createElement('div', { className: 'rubric' },
    React.createElement('span', { className: 'rubric-label' }, 'Rubric'),
    cells,
    React.createElement('span', { className: cls('rubric-sum', sc) }, txt));
}

Object.assign(window, { Pill, StatusPill, LanePill, SevPill, Conf, ScoreRing, ProgressBar, EmptyState, NoteField, EditableNum, RubricStrip });
