// Main app: routing, role + scenario state, layout, drawer/modal orchestration.

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "density": "balanced",
  "sidebarStyle": "dark",
  "scenario": "busy",
  "viewport": "auto"
}/*EDITMODE-END*/;

const {
  Sidebar, PageHeader, Drawer, Modal, WidgetCard, Empty,
  AgentStrip, BlockersBoard, Priorities, ClientHealth, GoalsTracker, TranscriptRecs, ChurnRisk,
  ClientDrawerBody, KPIStrip, FocusBox,
  AtRiskAccounts, NextStepsModal, NeglectedAccounts, MyTasks, CreativeLogGaps, AccountWins,
  VukasiKPIStrip, ToastProvider,
  AgentsRoute, ClientHealthRoute, AtRiskRoute, CreativeLogRoute, PlaceholderRoute,
  BlockersRoute, GoalsRoute, TranscriptsRoute, TasksRoute, WinsRoute, NeglectedRoute,
} = window.DC;

function App() {
  const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [role, setRole]   = useState('owner');
  const [view, setView]   = useState('overview');
  const [collapsed, setCollapsed] = useState(false);
  const [drawerSlug, setDrawerSlug] = useState(null);
  const [stepsAccount, setStepsAccount] = useState(null);
  const [agentExpanded, setAgentExpanded] = useState(null);

  // Auto-collapse sidebar on phone widths + when navigating
  useEffect(() => {
    const mq = window.matchMedia('(max-width: 760px)');
    const apply = () => setCollapsed(mq.matches);
    apply();
    mq.addEventListener('change', apply);
    return () => mq.removeEventListener('change', apply);
  }, []);
  // Cross-component nav events (e.g. drawer "View all → transcripts")
  useEffect(() => {
    const onNav = (e) => { setView(e.detail); setDrawerSlug(null); if (window.matchMedia('(max-width: 760px)').matches) setCollapsed(true); };
    window.addEventListener('dc:nav', onNav);
    return () => window.removeEventListener('dc:nav', onNav);
  }, []);
  const navigate = (v) => {
    setView(v);
    if (window.matchMedia('(max-width: 760px)').matches) setCollapsed(true);
  };

  const scenarios = window.DC_DATA.SCENARIOS;
  const scenarioKey = tweaks.scenario || 'busy';
  const henryData  = scenarios[scenarioKey].henry;
  const vukasiData = scenarios[scenarioKey].vukasi;

  const [blockers, setBlockers] = useState(henryData.data.blockers);
  const [priorities, setPriorities] = useState(henryData.data.priorities);
  const [prioritiesSource, setPrioritiesSource] = useState('mock');
  const [transcriptRecs, setTranscriptRecs] = useState(henryData.data.transcriptRecs);
  useEffect(() => {
    setBlockers(henryData.data.blockers);
    if (prioritiesSource === 'mock') setPriorities(henryData.data.priorities);
    setTranscriptRecs(henryData.data.transcriptRecs);
  }, [scenarioKey]);

  // Fetch real priorities from the FastAPI backend (Henry only).
  // Falls back to mock data on any failure so the widget still renders.
  useEffect(() => {
    if (role !== 'owner') return;
    const ctrl = new AbortController();
    fetch('https://dashboard-api.digitalcontractors.io/api/priorities', {
      credentials: 'include',
      signal: ctrl.signal,
    })
      .then(r => r.ok ? r.json() : Promise.reject(new Error('http ' + r.status)))
      .then(d => {
        if (Array.isArray(d.priorities) && d.priorities.length > 0) {
          setPriorities(d.priorities);
          setPrioritiesSource('api');
        }
      })
      .catch(err => {
        if (err.name !== 'AbortError') console.warn('priorities fetch failed; using mock', err);
      });
    return () => ctrl.abort();
  }, [role]);

  useEffect(() => {
    document.body.dataset.density = tweaks.density;
    document.body.dataset.viewport = tweaks.viewport;
    document.body.dataset.sidebar = tweaks.sidebarStyle;
  }, [tweaks.density, tweaks.viewport, tweaks.sidebarStyle]);

  useEffect(() => { if (tweaks.viewport === 'phone') setCollapsed(true); }, [tweaks.viewport]);

  const onPickClient = (slug) => setDrawerSlug(slug);
  const data = role === 'owner' ? henryData.data : vukasiData.data;
  const isPhone = tweaks.viewport === 'phone';
  const goOverview = () => setView('overview');

  // Per-route shells render their own page; only Overview uses the grid layout.
  const renderRoute = () => {
    if (view === 'overview') return null;

    if (role === 'owner') {
      if (view === 'agents') return <AgentsRoute onBack={goOverview} />;
      if (view === 'clients') return <ClientHealthRoute clients={data.clientHealth} onPickClient={onPickClient} onBack={goOverview} />;
      if (view === 'blockers') return <BlockersRoute blockers={blockers} setBlockers={setBlockers} onBack={goOverview} />;
      if (view === 'goals')    return <GoalsRoute goals={data.goals} onBack={goOverview} />;
      if (view === 'transcripts') return <TranscriptsRoute onBack={goOverview} />;
      if (view === 'tasks')    return <TasksRoute onBack={goOverview} ownerName="Henry" />;
      // Owner-elevated TEAM routes — reuse Vukasi routes, read-only.
      const vData = vukasiData.data;
      if (view === 'team-at-risk')   return <AtRiskRoute accounts={vData.atRiskAccounts} onOpenSteps={setStepsAccount} onBack={goOverview} readOnly />;
      if (view === 'team-neglected') return <NeglectedRoute accounts={vData.neglectedAccounts} onPickClient={onPickClient} onBack={goOverview} readOnly />;
      if (view === 'team-creative')  return <CreativeLogRoute onBack={goOverview} readOnly />;
      if (view === 'team-wins')      return <WinsRoute onBack={goOverview} readOnly />;
    } else {
      if (view === 'at-risk')  return <AtRiskRoute accounts={data.atRiskAccounts} onOpenSteps={setStepsAccount} onBack={goOverview} />;
      if (view === 'creative') return <CreativeLogRoute onBack={goOverview} />;
      if (view === 'neglected') return <NeglectedRoute accounts={data.neglectedAccounts} onPickClient={onPickClient} onBack={goOverview} />;
      if (view === 'tasks')    return <TasksRoute onBack={goOverview} />;
      if (view === 'wins')     return <WinsRoute onBack={goOverview} />;
    }
    return null;
  };

  const route = renderRoute();

  return (
    <ToastProvider>
      <div className="app-shell" style={{ display: 'flex', minHeight: '100vh', background: 'var(--bg)' }}>
        <Sidebar role={role} view={view} setView={navigate}
                 collapsed={collapsed} onClose={() => setCollapsed(true)}
                 sidebarStyle={tweaks.sidebarStyle} />

        <main style={{ flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column' }}>
          <PageHeader role={role} scenario={scenarioKey}
                      onScenario={(s) => setTweak('scenario', s)}
                      onMenuToggle={() => setCollapsed(c => !c)} />

          {route ? (
            <div style={{ padding: isPhone ? '14px' : '20px 24px 80px', flex: 1 }}>{route}</div>
          ) : (
            <div className="overview-grid" style={{
              padding: isPhone ? '14px' : '20px 24px 80px', flex: 1,
              display: 'grid',
              gridTemplateColumns: isPhone ? '1fr' : 'repeat(12, 1fr)',
              gap: 'var(--gap-grid)', alignContent: 'start',
            }}>
              {role === 'owner' ? (
                <React.Fragment>
                  {data.kpis && <div style={{ gridColumn: isPhone ? 'auto' : '1 / -1' }}><KPIStrip kpis={data.kpis} /></div>}
                  {data.focus && <div style={{ gridColumn: isPhone ? 'auto' : '1 / -1' }}><FocusBox focus={data.focus} /></div>}
                  <div style={{ gridColumn: isPhone ? 'auto' : '1 / -1' }}>
                    <ViewAllShell title="AI agents" onMore={() => setView('agents')}>
                      <AgentStrip agents={data.agents} expandedId={agentExpanded} setExpandedId={setAgentExpanded} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : '1 / -1' }}>
                    <ViewAllShell title="Blockers" onMore={() => setView('blockers')}>
                      <BlockersBoard blockers={blockers} setBlockers={setBlockers} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 7' }}>
                    <Priorities priorities={priorities} setPriorities={setPriorities} />
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 5' }}>
                    <ViewAllShell title="Goals" onMore={() => setView('goals')}>
                      <GoalsTracker goals={data.goals} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 7' }}>
                    <ViewAllShell title="Transcript recs" onMore={() => setView('transcripts')}>
                      <TranscriptRecs recs={transcriptRecs} setRecs={setTranscriptRecs} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 5' }}><ChurnRisk /></div>
                </React.Fragment>
              ) : (
                <React.Fragment>
                  {data.kpis && <div style={{ gridColumn: isPhone ? 'auto' : '1 / -1' }}><VukasiKPIStrip kpis={data.kpis} /></div>}
                  <div style={{ gridColumn: isPhone ? 'auto' : '1 / -1' }}>
                    <ViewAllShell title="At-risk accounts" onMore={() => setView('at-risk')}>
                      <AtRiskAccounts accounts={data.atRiskAccounts} onOpenSteps={setStepsAccount} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 5' }}>
                    <ViewAllShell title="My tasks" onMore={() => setView('tasks')}>
                      <MyTasks tasks={data.myTasks} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 7' }}>
                    <ViewAllShell title="Neglected" onMore={() => setView('neglected')}>
                      <NeglectedAccounts rows={data.neglectedAccounts} onPickClient={onPickClient} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 7' }}>
                    <ViewAllShell title="Creative log gaps" onMore={() => setView('creative')}>
                      <CreativeLogGaps rows={data.creativeLogGaps} />
                    </ViewAllShell>
                  </div>
                  <div style={{ gridColumn: isPhone ? 'auto' : 'span 5' }}>
                    <ViewAllShell title="Account wins" onMore={() => setView('wins')}>
                      <AccountWins wins={data.accountWins} />
                    </ViewAllShell>
                  </div>
                </React.Fragment>
              )}
            </div>
          )}

          <footer style={{
            padding: '14px 24px', borderTop: '1px solid var(--border)',
            display: 'flex', justifyContent: 'space-between', alignItems: 'center',
            fontSize: 11, color: 'var(--ink-soft)', letterSpacing: '0.04em', textTransform: 'uppercase',
          }}>
            <span>Digital Contractors · Internal · v0.1</span>
            <span>Auth via Cloudflare Access · {role === 'owner' ? 'henry@digitalcontractors.io' : 'vukasi@digitalcontractors.io'}</span>
          </footer>
        </main>
      </div>

      <Drawer open={!!drawerSlug} onClose={() => setDrawerSlug(null)}>
        <ClientDrawerBody slug={drawerSlug} onClose={() => setDrawerSlug(null)} />
      </Drawer>

      <Modal open={!!stepsAccount} onClose={() => setStepsAccount(null)}>
        <NextStepsModal account={stepsAccount} onClose={() => setStepsAccount(null)} />
      </Modal>

      <TweaksPanel>
        <TweakSection label="Display" />
        <TweakRadio  label="Density"   value={tweaks.density}      options={['compact','balanced','spacious']} onChange={v => setTweak('density', v)} />
        <TweakRadio  label="Sidebar"   value={tweaks.sidebarStyle} options={['dark','light','minimal']}        onChange={v => setTweak('sidebarStyle', v)} />
        <TweakRadio  label="Viewport"  value={tweaks.viewport}     options={['auto','phone']}                  onChange={v => setTweak('viewport', v)} />
        <TweakSection label="Mock data" />
        <TweakRadio  label="Scenario"  value={tweaks.scenario}     options={['calm','busy','crisis']}          onChange={v => setTweak('scenario', v)} />
        <TweakSection label="Demo only" />
        <TweakRadio  label="View as"   value={role}                options={['owner','media-buyer']}           onChange={v => { setRole(v); setView('overview'); }} />
      </TweaksPanel>
    </ToastProvider>
  );
}

// Wraps an Overview widget with a "View all →" affordance in its top-right.
function ViewAllShell({ title, onMore, children }) {
  return (
    <div style={{ display: 'flex', flexDirection: 'column' }}>
      {children}
      <button onClick={onMore} style={{
        marginTop: 8, alignSelf: 'flex-end',
        background: 'transparent', border: 0, cursor: 'pointer',
        fontSize: 10.5, letterSpacing: '0.06em', textTransform: 'uppercase', fontWeight: 600,
        color: 'var(--forest-700)', padding: '6px 8px',
      }}>View all →</button>
    </div>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
