// App.jsx — main shell + routing

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "dark",
  "accent": "cyan",
  "density": "comfy",
  "liveData": true,
  "showSparkline": true,
  "showWarnings": true,
  "showOutreach": true,
  "showSystems": true,
  "showSync": true
}/*EDITMODE-END*/;

const ACCENT_PALETTE = {
  cyan:    { c: '#22D3EE', c2: '#06B6D4', glow: 'rgba(34,211,238,0.18)', soft: 'rgba(34,211,238,0.08)' },
  violet:  { c: '#A78BFA', c2: '#8B5CF6', glow: 'rgba(167,139,250,0.18)', soft: 'rgba(167,139,250,0.08)' },
  emerald: { c: '#10B981', c2: '#059669', glow: 'rgba(16,185,129,0.18)', soft: 'rgba(16,185,129,0.08)' },
  amber:   { c: '#F59E0B', c2: '#D97706', glow: 'rgba(245,158,11,0.18)', soft: 'rgba(245,158,11,0.08)' },
  pink:    { c: '#F472B6', c2: '#EC4899', glow: 'rgba(244,114,182,0.18)', soft: 'rgba(244,114,182,0.08)' }
};

function App() {
  const [tweaks, setTweak] = window.useTweaks(TWEAK_DEFAULTS);
  const [active, setActive]   = React.useState('overview');
  const [selectedLead, setSelectedLead] = React.useState(null);
  const [range, setRange]     = React.useState('24h');
  const [time, setTime]       = React.useState('10:24:37');
  const [warnings, setWarnings] = React.useState(window.VELUNA_DATA.warnings);
  const [dataTick, setDataTick] = React.useState(0);
  const [apiState, setApiState] = React.useState(window.VELUNA_API_STATE || { mode: 'pending', error: null });

  // Re-render on BFF data updates (initial hydrate + manual refresh).
  React.useEffect(() => {
    function onUpdate(ev) {
      setApiState(ev.detail || window.VELUNA_API_STATE);
      setWarnings(window.VELUNA_DATA.warnings);
      setDataTick(t => t + 1);
    }
    window.addEventListener('veluna:data-updated', onUpdate);
    return () => window.removeEventListener('veluna:data-updated', onUpdate);
  }, []);

  // Apply theme/density/accent to <html>
  React.useEffect(() => {
    const root = document.documentElement;
    root.dataset.theme   = tweaks.theme;
    root.dataset.density = tweaks.density;
    const a = ACCENT_PALETTE[tweaks.accent] || ACCENT_PALETTE.cyan;
    root.style.setProperty('--accent', a.c);
    root.style.setProperty('--accent-2', a.c2);
    root.style.setProperty('--accent-glow', a.glow);
    root.style.setProperty('--accent-soft', a.soft);
  }, [tweaks.theme, tweaks.density, tweaks.accent]);

  // Live clock
  React.useEffect(() => {
    if (!tweaks.liveData) return;
    const iv = setInterval(() => {
      const d = new Date();
      setTime(`${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}:${String(d.getSeconds()).padStart(2,'0')}`);
    }, 1000);
    return () => clearInterval(iv);
  }, [tweaks.liveData]);

  function handleRefresh() {
    const d = new Date();
    setTime(`${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}:${String(d.getSeconds()).padStart(2,'0')}`);
    if (window.VELUNA_API && typeof window.VELUNA_API.refresh === 'function') {
      window.VELUNA_API.refresh();
    }
  }

  function dismissWarning(id) {
    setWarnings(ws => ws.filter(w => w.id !== id));
  }

  const screenInfo = {
    overview: { title: 'Veluna Growth Stack — Live Dashboard', sub: 'Übersicht zu Leads, Automationen, Outreach und Sync-Status' },
    pipeline: { title: 'Lead Pipeline',         sub: 'Stages, Übergänge und Conversion durch die gesamte Pipeline' },
    leads:    { title: 'Potenzielle Leads',     sub: 'Alle Leads — filtern, sortieren, anreichern' },
    outreach: { title: 'Outreach',              sub: 'Sequenzen, Conversion-Funnel und Performance' },
    sync:     { title: 'Sync & Integrationen',  sub: 'Status der Verbindungen und Sync-Verlauf' },
    storage:  { title: 'Speicherung',           sub: 'Datenbanken, Tabellen und Backup-Status' },
    log:      { title: 'Aktivitätsprotokoll',   sub: 'Vollständige Historie aller System-Events' },
    systems:  { title: 'Systeme & Automationen',sub: 'Verbundene Services und automatisierte Workflows' },
    settings: { title: 'Einstellungen',         sub: 'Workspace, Scoring, Benachrichtigungen, API' }
  };

  const info = screenInfo[active];

  return (
    <div style={{ display: 'flex', height: '100vh', position: 'relative' }}>
      <div className="bg-grid" />
      <window.Sidebar active={active} onNav={(id) => { setActive(id); setSelectedLead(null); }} />

      <main style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, position: 'relative', zIndex: 1 }}>
        <window.Topbar
          title={info.title}
          sub={info.sub}
          time={time}
          onRefresh={handleRefresh}
          range={range}
          onRangeChange={setRange}
          paused={!tweaks.liveData}
          onPauseToggle={() => setTweak('liveData', !tweaks.liveData)}
        />

        <div style={{ flex: 1, overflowY: 'auto', overflowX: 'hidden', padding: '20px 28px 28px' }}>
          {active === 'overview' && (
            <div className="fade-in" style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
              {/* KPI row — 8 cards */}
              <div style={{ display: 'grid', gridTemplateColumns: 'repeat(8, 1fr)', gap: 14 }}>
                {window.VELUNA_DATA.kpis.map((k, i) => (
                  <window.KPICard key={k.id} kpi={k} sparkData={window.VELUNA_DATA.spark(i+1, 50, 30)} showSparkline={tweaks.showSparkline} onClick={() => {
                    if (k.id === 'sync_ok' || k.id === 'sync_err') setActive('sync');
                    else if (k.id === 'auto') setActive('systems');
                    else setActive('leads');
                  }} />
                ))}
              </div>

              {/* Row 2: Pipeline (8) + LiveActivity (4) */}
              <div style={{ display: 'grid', gridTemplateColumns: 'repeat(12, 1fr)', gap: 14 }}>
                <div style={{ gridColumn: 'span 8' }}><window.PipelineOverview /></div>
                <div style={{ gridColumn: 'span 4' }}><window.LiveActivity paused={!tweaks.liveData} /></div>
              </div>

              {/* Row 3: Leads preview (full width) */}
              <div style={{ display: 'grid', gridTemplateColumns: 'repeat(12, 1fr)', gap: 14 }}>
                <div style={{ gridColumn: 'span 12' }}><window.LeadsPreview onLeadClick={setSelectedLead} /></div>
              </div>

              {/* Row 4: Outreach + Systems + Sync */}
              <div style={{ display: 'grid', gridTemplateColumns: 'repeat(12, 1fr)', gap: 14 }}>
                {tweaks.showOutreach && <div style={{ gridColumn: 'span 4' }}><window.OutreachCard /></div>}
                {tweaks.showSystems  && <div style={{ gridColumn: 'span 4' }}><window.SystemsCard /></div>}
                {tweaks.showSync     && <div style={{ gridColumn: 'span 4' }}><window.SyncCard onDrilldown={() => setActive('sync')} /></div>}
              </div>

              {/* Row 5: Warnings */}
              {tweaks.showWarnings && (
                <div style={{ display: 'grid', gridTemplateColumns: 'repeat(12, 1fr)', gap: 14 }}>
                  <div style={{ gridColumn: 'span 12' }}><window.WarningsCard warnings={warnings} onDismiss={dismissWarning} /></div>
                </div>
              )}
            </div>
          )}

          {active === 'pipeline'  && <div className="fade-in" style={{ height: 'calc(100vh - 130px)' }}><window.PipelineScreen onLeadClick={setSelectedLead} /></div>}
          {active === 'leads'     && <div className="fade-in" style={{ height: 'calc(100vh - 130px)' }}><window.LeadsScreen onLeadClick={setSelectedLead} /></div>}
          {active === 'outreach'  && <div className="fade-in"><window.OutreachScreen /></div>}
          {active === 'sync'      && <div className="fade-in"><window.SyncScreen /></div>}
          {active === 'storage'   && <div className="fade-in"><window.StorageScreen /></div>}
          {active === 'log'       && <div className="fade-in" style={{ height: 'calc(100vh - 130px)' }}><window.LogScreen /></div>}
          {active === 'systems'   && <div className="fade-in"><window.SystemsScreen /></div>}
          {active === 'settings'  && <div className="fade-in"><window.SettingsScreen /></div>}
        </div>
      </main>

      {selectedLead && <window.LeadDrawer lead={selectedLead} onClose={() => setSelectedLead(null)} />}

      <VelunaTweaks tweaks={tweaks} setTweak={setTweak} />
    </div>
  );
}

function VelunaTweaks({ tweaks, setTweak }) {
  const { TweaksPanel: Panel, TweakSection, TweakRadio, TweakToggle, TweakSelect } = window;
  return (
    <Panel title="Tweaks">
      <TweakSection label="Erscheinungsbild">
        <TweakRadio label="Theme"   value={tweaks.theme}   options={[{value:'dark',label:'Dark'},{value:'light',label:'Light'}]}   onChange={(v) => setTweak('theme', v)} />
        <TweakRadio label="Dichte" value={tweaks.density} options={[{value:'comfy',label:'Comfy'},{value:'compact',label:'Compact'}]} onChange={(v) => setTweak('density', v)} />
        <TweakSelect label="Akzentfarbe" value={tweaks.accent} onChange={(v) => setTweak('accent', v)} options={[
          { value: 'cyan',    label: 'Cyan'    },
          { value: 'violet',  label: 'Violet'  },
          { value: 'emerald', label: 'Emerald' },
          { value: 'amber',   label: 'Amber'   },
          { value: 'pink',    label: 'Pink'    }
        ]} />
      </TweakSection>
      <TweakSection label="Daten">
        <TweakToggle label="Live-Daten Simulation"     value={tweaks.liveData}      onChange={(v) => setTweak('liveData', v)} />
        <TweakToggle label="Sparklines auf KPI-Karten" value={tweaks.showSparkline} onChange={(v) => setTweak('showSparkline', v)} />
      </TweakSection>
      <TweakSection label="Sektionen anzeigen">
        <TweakToggle label="Outreach & Kommunikation"  value={tweaks.showOutreach}  onChange={(v) => setTweak('showOutreach', v)} />
        <TweakToggle label="Speicherung & Systeme"     value={tweaks.showSystems}   onChange={(v) => setTweak('showSystems', v)} />
        <TweakToggle label="Sync-Status"               value={tweaks.showSync}      onChange={(v) => setTweak('showSync', v)} />
        <TweakToggle label="Warnungen / Blocker"       value={tweaks.showWarnings}  onChange={(v) => setTweak('showWarnings', v)} />
      </TweakSection>
    </Panel>
  );
}

window.App = App;
