/* ══════════════════════════════════════════════════════════════════
   ATLAS COCKPIT — TODAY + ACTION QUEUE
   ══════════════════════════════════════════════════════════════════ */

function greeting() {
  const h = new Date().getHours();
  return h < 5 ? 'Late night' : h < 12 ? 'Good morning' : h < 17 ? 'Good afternoon' : 'Good evening';
}

/* ───────────────────────────  ACTION QUEUE  ─────────────────────── */
function ActionQueue() {
  const D = window.ATLAS_DATA;
  const state = useStore();
  const [prio, setPrio] = useState('all');
  const [proj, setProj] = useState('all');
  const [hideDeferred, setHideDeferred] = useState(false);
  const [openId, setOpenId] = useState(null);
  const [sel, setSel] = useState({});
  const [selMode, setSelMode] = useState(false);
  const dragId = useRef(null);
  const [dragOver, setDragOver] = useState(null);

  const decisions = state.decisions.actions || {};
  const ACTS = Array.isArray(state.actions) ? state.actions : [];
  let orderArr = state.actionOrder ? [...state.actionOrder] : [...ACTS]
    .sort((a, b) => (URGENCY_RANK[a.urgency] - URGENCY_RANK[b.urgency]) || (ACTS.indexOf(a) - ACTS.indexOf(b)))
    .map(a => a.id);
  const byId = Object.fromEntries(ACTS.map(a => [a.id, a]));
  ACTS.forEach(a => { if (!orderArr.includes(a.id)) orderArr.push(a.id); });

  // present = not removed (approve/decline/dismiss). deferred stays.
  let list = orderArr.map(id => byId[id]).filter(Boolean).filter(a => {
    const d = decisions[a.id];
    return !d || d.decision === 'defer';
  });
  // filters
  if (prio !== 'all') list = list.filter(a => prio === 'high' ? (a.urgency === 'critical' || a.urgency === 'high') : a.urgency === prio);
  if (proj !== 'all') list = list.filter(a => a.project === proj);
  if (hideDeferred) list = list.filter(a => !(decisions[a.id] && decisions[a.id].decision === 'defer'));
  // deferred to bottom
  list.sort((a, b) => {
    const da = decisions[a.id] && decisions[a.id].decision === 'defer' ? 1 : 0;
    const db = decisions[b.id] && decisions[b.id].decision === 'defer' ? 1 : 0;
    return da - db;
  });

  const projectsWithActions = [...new Set(ACTS.map(a => a.project).filter(Boolean))];
  const selectedIds = Object.keys(sel).filter(k => sel[k]);

  const reorder = (targetId) => {
    if (!dragId.current || dragId.current === targetId) return;
    const arr = [...orderArr];
    const from = arr.indexOf(dragId.current), to = arr.indexOf(targetId);
    arr.splice(to, 0, arr.splice(from, 1)[0]);
    setKV({ actionOrder: arr });
  };

  const bulk = (act) => {
    selectedIds.forEach(id => { const a = byId[id]; if (a) logDecision('actions', 'actions', id, act, a.title, ''); });
    toast(`${selectedIds.length} action${selectedIds.length === 1 ? '' : 's'} ${act === 'approve' ? 'approved' : 'deferred'}`);
    setSel({}); setSelMode(false);
  };

  return React.createElement('div', null,
    React.createElement('div', { className: 'toolbar' },
      React.createElement('div', { className: 'seg' },
        [['all', 'All'], ['high', 'High priority'], ['medium', 'Medium'], ['low', 'Low']].map(([k, l]) =>
          React.createElement('button', { key: k, className: prio === k ? 'on' : '', onClick: () => setPrio(k) }, l))),
      projectsWithActions.length > 0 && React.createElement('select', { className: 'field', style: { width: 'auto', minWidth: 130 }, value: proj, onChange: e => setProj(e.target.value) },
        React.createElement('option', { value: 'all' }, 'All projects'),
        projectsWithActions.map(pid => React.createElement('option', { key: pid, value: pid }, (D.projects.find(p => p.id === pid) || {}).name || pid))),
      React.createElement('div', { className: 'tb-sp' }),
      React.createElement('button', { className: cls('chip', hideDeferred && 'on'), onClick: () => setHideDeferred(v => !v) }, 'Hide deferred'),
      React.createElement('button', { className: cls('chip', selMode && 'on'), onClick: () => { setSelMode(v => !v); setSel({}); } }, React.createElement(Icon, { name: 'check', size: 13 }), 'Select')
    ),
    selectedIds.length > 0 && React.createElement('div', { className: 'bulkbar' },
      React.createElement('span', { className: 'bb-count' }, selectedIds.length, ' selected'),
      React.createElement('span', { className: 'bb-sp' }),
      React.createElement('button', { onClick: () => bulk('approve') }, 'Approve'),
      React.createElement('button', { onClick: () => bulk('defer') }, 'Defer'),
      React.createElement('button', { onClick: () => { setSel({}); setSelMode(false); } }, 'Clear')
    ),
    list.length === 0
      ? React.createElement(EmptyState, { icon: 'checkCircle', title: 'Queue clear', children: 'Nothing is awaiting your decision in this view.' })
      : React.createElement('div', { className: 'queue' }, list.map(a => React.createElement(ActionCard, {
          key: a.id, action: a, decisions, open: openId === a.id, onToggle: () => setOpenId(o => o === a.id ? null : a.id),
          selMode, selected: !!sel[a.id], onSelect: () => setSel(s => ({ ...s, [a.id]: !s[a.id] })),
          dragOver: dragOver === a.id,
          onDragStart: () => { dragId.current = a.id; }, onDragEnter: () => setDragOver(a.id),
          onDragEnd: () => { setDragOver(null); dragId.current = null; }, onDrop: () => { reorder(a.id); setDragOver(null); }
        })))
  );
}

function ActionCard({ action, decisions, open, onToggle, selMode, selected, onSelect, dragOver, onDragStart, onDragEnter, onDragEnd, onDrop }) {
  const cl = useStore(s => s.checklists[action.id] || {});
  const deferred = decisions[action.id] && decisions[action.id].decision === 'defer';
  const done = action.checklist ? action.checklist.filter((_, i) => cl[i]).length : 0;
  const total = action.checklist ? action.checklist.length : 0;
  const overdue = action.due && daysUntil(action.due) < 0;
  const dueSoon = action.due && daysUntil(action.due) >= 0 && daysUntil(action.due) <= 2;

  return React.createElement('div', {
    className: cls('aq', 'u-' + action.urgency, open && 'open', dragOver && 'drop-into'),
    style: deferred ? { opacity: 0.62 } : null,
    draggable: !selMode, onDragStart, onDragEnter: (e) => { e.preventDefault(); onDragEnter(); }, onDragOver: (e) => e.preventDefault(), onDragEnd, onDrop
  },
    React.createElement('div', { className: 'aq-bar' },
      React.createElement('div', { className: 'aq-prio' }),
      React.createElement('div', { className: 'aq-main' },
        React.createElement('div', { className: 'aq-top', onClick: onToggle, tabIndex: 0, onKeyDown: (e) => { if (e.key === 'Enter') onToggle(); } },
          selMode
            ? React.createElement('span', { className: cls('tick', selected && 'on'), style: { marginTop: 2 }, onClick: (e) => { e.stopPropagation(); onSelect(); } })
            : React.createElement('span', { className: 'aq-grip', onMouseDown: e => e.stopPropagation(), title: 'Drag to reorder' }, React.createElement(Icon, { name: 'grip', size: 16 })),
          React.createElement('div', { className: 'aq-body' },
            React.createElement('div', { className: 'aq-title-row' },
              React.createElement('span', { className: cls('utag', action.urgency) }, action.urgency),
              React.createElement('span', { className: 'aq-title' }, action.title),
              deferred && React.createElement(Pill, { kind: 'ghost' }, 'deferred')),
            React.createElement('div', { className: 'aq-why' }, action.why),
            React.createElement('div', { className: 'aq-meta' },
              React.createElement('span', { className: 'm' }, React.createElement(Icon, { name: 'doc', size: 12 }), action.source),
              action.due && React.createElement('span', { className: cls('m', overdue ? 'overdue' : dueSoon ? 'due' : '') }, React.createElement(Icon, { name: 'clock', size: 12 }), relDays(action.due)),
              total > 0 && React.createElement('span', { className: 'aq-prog' }, React.createElement(ProgressBar, { value: done, total }), React.createElement('span', { className: 'mono', style: { fontSize: 10.5, color: 'var(--ink-faint)' } }, `${done}/${total}`)))),
          React.createElement('span', { className: 'aq-chev' }, React.createElement(Icon, { name: 'chevronD', size: 16 }))),
        React.createElement('div', { className: 'aq-expand' },
          React.createElement('div', { className: 'aq-expand-inner' },
            action.suggestedMove && React.createElement('div', { className: 'aq-suggest' }, React.createElement(Icon, { name: 'sparkle', size: 15, className: 'si' }), React.createElement('span', null, action.suggestedMove)),
            action.checklist && React.createElement(Checklist, { action }),
            React.createElement(NoteField, { store: 'actions', id: action.id, placeholder: 'Notes, questions, where credentials live…' }),
            React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' } },
              React.createElement(DecisionBar, { store: 'actions', id: action.id, title: action.title, compact: true, note: () => loadNote('actions', action.id) }),
              React.createElement('button', { className: 'btn sm ghost', style: { marginLeft: 'auto' }, onClick: (e) => { e.stopPropagation(); openDrawer('action', action.id); } }, 'Open detail', React.createElement(Icon, { name: 'arrowR', size: 13, className: 'bico' })))))
      )
    )
  );
}

/* ───────────────────────────  RAIL PIECES  ─────────────────────── */
function BlockersRail() {
  const D = window.ATLAS_DATA;
  const blockers = useStore(s => s.blockers);
  const [open, setOpen] = useState({});
  const openCount = D.blockers.filter(b => !blockers[b.id]).length;
  const toggle = (b) => {
    Store.set(s => {
      const bl = { ...s.blockers, [b.id]: !s.blockers[b.id] };
      const checklists = { ...s.checklists };
      if (b.linkActionId && typeof b.linkChecklistIdx === 'number') {
        checklists[b.linkActionId] = { ...(checklists[b.linkActionId] || {}), [b.linkChecklistIdx]: bl[b.id] };
      }
      return { ...s, blockers: bl, checklists };
    });
  };
  return React.createElement('div', { className: 'card mini' },
    React.createElement('div', { className: 'mini-head' },
      React.createElement(Icon, { name: 'pin', size: 15, style: { color: 'var(--accent)' } }),
      React.createElement('span', { className: 't' }, 'Needs your input'),
      React.createElement('span', { className: 'c' }, React.createElement(Pill, { kind: '' }, openCount, ' open'))),
    openCount === 0
      ? React.createElement('div', { style: { fontSize: 13, color: 'var(--ink-muted)', padding: '8px 0' } }, 'All blockers cleared — ready to launch.')
      : D.blockers.map(b => {
          const done = !!blockers[b.id];
          const isOpen = !!open[b.id];
          return React.createElement('div', { key: b.id, className: 'blk' },
            React.createElement('div', { className: cls('blk-row', isOpen && 'open') },
              React.createElement('span', { className: cls('tick', done && 'on'), style: { marginTop: 1 }, onClick: (e) => { e.stopPropagation(); toggle(b); } }),
              React.createElement('div', { className: 'mr-main', style: { cursor: 'pointer', opacity: done ? 0.5 : 1 }, onClick: () => setOpen(o => ({ ...o, [b.id]: !o[b.id] })) },
                React.createElement('div', { className: 'mr-title', style: done ? { textDecoration: 'line-through' } : null }, b.title),
                React.createElement('div', { className: 'mr-sub' }, b.link)),
              React.createElement('span', { className: 'blk-chev', onClick: () => setOpen(o => ({ ...o, [b.id]: !o[b.id] })) }, React.createElement(Icon, { name: 'chevronD', size: 15 }))),
            isOpen && React.createElement('div', { className: 'blk-detail' },
              React.createElement('div', { className: 'blk-why' }, b.why),
              b.linkActionId && React.createElement('div', { className: 'blk-link' }, '↳ linked to action checklist'),
              React.createElement(NoteField, { store: 'blockers', id: b.id, placeholder: 'Notes, credentials reference (1Password), links, questions for Claude…' })));
        })
  );
}

function WeekRail() {
  const D = window.ATLAS_DATA;
  const week = useStore(s => s.week);
  const todayISO = new Date().toISOString().slice(0, 10);
  const toggle = (date) => Store.set(s => ({ ...s, week: { ...s.week, [date]: !s.week[date] } }));
  return React.createElement('div', { className: 'card mini' },
    React.createElement('div', { className: 'mini-head' },
      React.createElement(Icon, { name: 'calendar', size: 15, style: { color: 'var(--ink-muted)' } }),
      React.createElement('span', { className: 't' }, 'This week')),
    D.thisWeek.map(d => React.createElement('div', { key: d.date, className: 'mini-row', style: { cursor: 'pointer' }, onClick: () => toggle(d.date) },
      React.createElement('span', { className: cls('tick', week[d.date] && 'on'), style: { marginTop: 1 } }),
      React.createElement('div', { className: 'mr-main' },
        React.createElement('div', { className: cls('mr-title', week[d.date] && 'done'), style: { color: d.date === todayISO ? 'var(--accent)' : week[d.date] ? 'var(--ink-faint)' : 'var(--ink)', textDecoration: week[d.date] ? 'line-through' : 'none' } }, d.day.replace(/,.*/, '') + (d.date === todayISO ? ' · today' : '')),
        React.createElement('div', { className: 'mr-sub' }, d.text))))
  );
}

function RisksRail({ onView }) {
  const D = window.ATLAS_DATA;
  const decided = useStore(s => s.decisions.risks);
  const open = D.risks.filter(r => !decided[r.id]);
  return React.createElement('div', { className: 'card mini' },
    React.createElement('div', { className: 'mini-head' },
      React.createElement(Icon, { name: 'risks', size: 15, style: { color: 'var(--danger)' } }),
      React.createElement('span', { className: 't' }, 'Highest exposure'),
      React.createElement('span', { className: 'c' }, React.createElement('button', { className: 'btn xs ghost', onClick: onView }, 'All'))),
    open.slice(0, 3).map(r => React.createElement('div', { key: r.id, className: 'mini-row', style: { cursor: 'pointer' }, onClick: () => openDrawer('risk', r.id) },
      React.createElement('span', { className: cls('pdot'), style: { width: 7, height: 7, borderRadius: 99, marginTop: 6, background: r.severity === 'high' ? 'var(--danger)' : r.severity === 'medium' ? 'var(--warning)' : 'var(--ink-faint)' } }),
      React.createElement('div', { className: 'mr-main' },
        React.createElement('div', { className: 'mr-title' }, r.title),
        React.createElement('div', { className: 'mr-sub' }, r.severity, ' severity'))))
  );
}

/* ───────────────────────────  TODAY VIEW  ──────────────────────── */
function TodayView({ onNavigate }) {
  const D = window.ATLAS_DATA;
  const state = useStore();
  const openActions = getActions().filter(a => { const d = state.decisions.actions[a.id]; return !d || d.decision === 'defer'; }).length;
  const openBlockers = D.blockers.filter(b => !state.blockers[b.id]).length;
  const kenDays = daysUntil(D.kenBeta);
  const anyRev = D.projects.some(p => p.mtdRevenue != null);
  const confirmedMtd = D.projects.reduce((a, p) => p.mtdRevenue != null ? a + p.mtdRevenue : a, 0);
  const mtd = state.kpis.mtdRevenue != null ? state.kpis.mtdRevenue : (anyRev ? confirmedMtd : null);
  const openRisks = D.risks.filter(r => !state.decisions.risks[r.id]).length;

  const headline = openBlockers > 0
    ? [React.createElement('span', { key: 1, className: 'hl' }, openActions, ' decisions'), ' await your call — ',
       React.createElement('span', { key: 2, className: 'hl' }, openBlockers, ' blocker', openBlockers === 1 ? '' : 's'), ' still stand between ATLAS and launch.']
    : [React.createElement('span', { key: 1, className: 'hl' }, openActions, ' decisions'), ' await your call. The board is ',
       React.createElement('span', { key: 2, className: 'hl' }, 'clear to launch'), '.'];

  return React.createElement('div', null,
    React.createElement(EodNudge),
    React.createElement('div', { className: 'hero' },
      React.createElement('div', { className: 'hero-greet' },
        React.createElement('span', { className: 'eyebrow' }, greeting(), ', Brendon'),
        React.createElement('span', { className: 'eyebrow', style: { color: 'var(--ink-faint)' } }, '· ', kenDays > 0 ? `dry-run · ${daysUntil(D.startDate)}d to go-live` : 'live')),
      React.createElement('div', { className: 'hero-line' }, headline),
      React.createElement('div', { className: 'hero-cta' },
        React.createElement('button', { className: 'btn sm ghost', onClick: openPalette }, React.createElement(Icon, { name: 'command', size: 13, className: 'bico' }), 'Command'),
        React.createElement('button', { className: 'btn sm', onClick: () => setKV({ focusMode: !state.focusMode }) }, React.createElement(Icon, { name: 'focus', size: 13, className: 'bico' }), state.focusMode ? 'Exit focus' : 'Focus')),
      React.createElement('div', { className: 'hero-stats' },
        React.createElement('div', { className: 'hero-stat' }, React.createElement('div', { className: 'v' }, openActions), React.createElement('div', { className: 'l' }, 'Awaiting decision')),
        React.createElement('div', { className: 'hero-stat' }, React.createElement('div', { className: cls('v', openBlockers > 0 && 'alert') }, openBlockers), React.createElement('div', { className: 'l' }, 'Blockers open')),
        React.createElement('div', { className: 'hero-stat' }, React.createElement('div', { className: 'v' }, kenDays, React.createElement('span', { style: { fontSize: 13, color: 'var(--ink-faint)', fontWeight: 600 } }, 'days')), React.createElement('div', { className: 'l' }, 'Ken beta')),
        React.createElement('div', { className: 'hero-stat' }, React.createElement('div', { className: 'v' }, fmt$(mtd)), React.createElement('div', { className: 'l' }, 'Confirmed MTD')))
    ),
    React.createElement('div', { className: 'today-grid' },
      React.createElement('div', null,
        React.createElement('div', { className: 'block-head', style: { marginTop: 0 } },
          React.createElement('span', { className: 'block-title' }, 'Action queue'),
          React.createElement('span', { className: 'block-aside' }, React.createElement('span', { className: 'block-count' }, openActions, ' awaiting'))),
        React.createElement(ActionQueue)),
      React.createElement('div', { className: 'rail' },
        React.createElement(LatestBriefCard),
        React.createElement(BlockersRail),
        React.createElement(RisksRail, { onView: () => onNavigate('risks') }),
        React.createElement(WeekRail))
    ),
    React.createElement(RecommendationsBlock)
  );
}

/* ───────────────────────────  RECOMMENDATIONS  ─────────────────── */
function RecommendationsBlock() {
  const D = window.ATLAS_DATA;
  const decided = useStore(s => s.decisions.recs);
  const open = D.recommendations.filter(r => !decided[r.id]);
  return React.createElement('div', { className: 'block' },
    React.createElement('div', { className: 'block-head' },
      React.createElement('span', { className: 'block-title' }, 'Recommendations'),
      React.createElement('span', { className: 'block-aside' }, React.createElement('span', { className: 'block-count' }, open.length, ' open · Claude-surfaced'))),
    open.length === 0
      ? React.createElement(EmptyState, { icon: 'sparkle', title: 'No open recommendations', children: 'Claude surfaces new portfolio recommendations on schedule once the orchestrator is live.' })
      : React.createElement('div', { className: 'rec-grid' }, open.map(r => React.createElement(RecCard, { key: r.id, r })))
  );
}

function RecCard({ r }) {
  const D = window.ATLAS_DATA;
  const proj = D.projects.find(p => p.id === r.project);
  return React.createElement('article', { className: 'card pad rec-card2' },
    React.createElement('div', { className: 'rec-top' },
      React.createElement('span', { className: 'rec-score2' }, r.score),
      React.createElement('div', { style: { flex: 1 } },
        React.createElement('div', { className: 'rec-title2' }, r.title),
        proj && React.createElement('div', { style: { marginTop: 6 } }, React.createElement(LanePill, { lane: proj.lane })))),
    React.createElement('div', { className: 'rec-thesis2' }, r.thesis),
    React.createElement('div', { className: 'eyebrow' }, 'Source — ', r.src),
    React.createElement(NoteField, { store: 'recs', id: r.id, placeholder: 'Conditions you\u2019d want met before approving\u2026' }),
    React.createElement(DecisionBar, { store: 'recs', id: r.id, title: r.title, compact: true, note: () => loadNote('recs', r.id) })
  );
}
Object.assign(window, { TodayView, ActionQueue, BlockersRail, WeekRail, RisksRail, RecommendationsBlock });
