// Main app — orchestrates screens, modal pages, and tweaks.

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "paper",
  "hero": "editorial",
  "density": "regular"
}/*EDITMODE-END*/;

const App = () => {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [screen, setScreen] = React.useState('landing'); // 'landing' | 'analyzing' | 'results'
  const [page, setPage] = React.useState(null); // modal page key or null
  const [analysis, setAnalysis] = React.useState(null);
  const [analyzeError, setAnalyzeError] = React.useState(null);
  const [filename, setFilename] = React.useState(null);

  const [darkMode, setDarkMode] = React.useState(() => {
    try { return localStorage.getItem('ctb-dark') === '1'; } catch { return false; }
  });
  const toggleDark = () => {
    setDarkMode(d => {
      const next = !d;
      try { localStorage.setItem('ctb-dark', next ? '1' : '0'); } catch {}
      return next;
    });
  };

  // Apply theme + density to <html>. Dark-mode toggle wins over the tweaks theme.
  React.useEffect(() => {
    const theme = darkMode ? 'ink' : (t.theme || 'paper');
    document.documentElement.setAttribute('data-theme', theme);
    document.documentElement.setAttribute('data-density', t.density || 'regular');
  }, [t.theme, t.density, darkMode]);

  // Keyboard shortcut: Enter on analyzing skips
  React.useEffect(() => {
    const k = (e) => {
      if (screen === 'analyzing' && e.key === 'Enter') setScreen('results');
    };
    window.addEventListener('keydown', k);
    return () => window.removeEventListener('keydown', k);
  }, [screen]);

  const reset = () => {
    setScreen('landing');
    setPage(null);
    setAnalysis(null);
    setAnalyzeError(null);
    setFilename(null);
    window.scrollTo(0, 0);
  };

  const onAnalyze = (file) => {
    setAnalysis(null);
    setAnalyzeError(null);
    setFilename(file?.name || null);
    setScreen('analyzing');
    window.scrollTo(0, 0);

    if (!file) return; // sample path — Analyzing falls back to SAMPLE_BILL

    const fd = new FormData();
    fd.append('file', file);
    fetch('/api/analyze', { method: 'POST', body: fd })
      .then(async (r) => {
        const data = await r.json().catch(() => ({}));
        if (!r.ok) {
          throw new Error(
            data?.error ||
              'Analysis is temporarily unavailable. Please try again in a moment.',
          );
        }
        return data;
      })
      .then((data) => setAnalysis(data))
      .catch((err) => {
        const isOffline = err?.message === 'Failed to fetch' || err?.name === 'TypeError';
        setAnalyzeError(
          isOffline
            ? 'We could not reach the analysis service. Check your connection and try again.'
            : String(err?.message || err),
        );
      });
  };

  return (
    <div className="shell">
      <Nav onPage={setPage} currentScreen={screen} onReset={reset} darkMode={darkMode} onToggleDark={toggleDark} />

      {screen === 'landing' && (
        <Landing
          hero={t.hero}
          onAnalyze={onAnalyze}
          onPage={setPage}
        />
      )}

      {screen === 'analyzing' && (
        <Analyzing
          filename={filename}
          waitingForApi={!!filename}
          analysis={analysis}
          analyzeError={analyzeError}
          onDone={() => { setScreen('results'); window.scrollTo(0, 0); }}
          onRetry={reset}
        />
      )}

      {screen === 'results' && (
        <Results
          density={t.density}
          onPage={setPage}
          bill={analysis?.bill || window.SAMPLE_BILL}
          script={analysis?.script || window.NEGOTIATION_SCRIPT}
        />
      )}

      <ModalPage pageKey={page} onClose={() => setPage(null)} />

      <TweaksPanel title="Tweaks">
        <TweakSection label="Theme" />
        <TweakRadio
          label="Color"
          value={t.theme}
          options={[
            { value: 'paper', label: 'Paper' },
            { value: 'slate', label: 'Slate' },
            { value: 'ink', label: 'Ink' }
          ]}
          onChange={v => setTweak('theme', v)}
        />
        <TweakSection label="Layout" />
        <TweakRadio
          label="Hero"
          value={t.hero}
          options={[
            { value: 'editorial', label: 'Editorial' },
            { value: 'numerical', label: 'Numerical' },
            { value: 'tool', label: 'Tool-first' }
          ]}
          onChange={v => setTweak('hero', v)}
        />
        <TweakRadio
          label="Density"
          value={t.density}
          options={[
            { value: 'compact', label: 'Compact' },
            { value: 'regular', label: 'Regular' }
          ]}
          onChange={v => setTweak('density', v)}
        />
        <TweakSection label="Demo" />
        <TweakButton label="Jump to results" onClick={() => setScreen('results')} />
        <TweakButton label="Restart from landing" onClick={reset} />
      </TweaksPanel>
    </div>
  );
};

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