/* eslint-disable */
// Main app shell — wires dashboard + session + tweaks panel

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "fontSize": 1,
  "paperTone": "warm",
  "showMarginalia": true,
  "cardRotation": 1
}/*EDITMODE-END*/;

const App = () => {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [state, setState] = useState(() => window.VocabStore.load());
  const [view, setView] = useState('dashboard');
  const [words, setWords] = useState(window.OXFORD_WORDS || []);

  // Save on every state change
  useEffect(() => { window.VocabStore.save(state); }, [state]);

  // Wait for words load
  useEffect(() => {
    if (!words.length) {
      const onLoad = () => setWords(window.OXFORD_WORDS || []);
      window.addEventListener('oxford-loaded', onLoad);
      return () => window.removeEventListener('oxford-loaded', onLoad);
    }
  }, []);

  // Apply paper tone to <html>
  useEffect(() => {
    document.documentElement.dataset.tone = t.paperTone;
  }, [t.paperTone]);

  // Pass mode/level setters into dashboard via state.settings
  const setSettings = (k, v) => setState(s => ({ ...s, settings: { ...s.settings, [k]: v }}));

  if (!words.length) {
    return (
      <div style={{ display:'flex', alignItems:'center', justifyContent:'center', minHeight:'100vh', fontFamily:'var(--font-mono)', color:'var(--ink-faded)' }}>
        Loading word list…
      </div>
    );
  }

  return (
    <div style={{ minHeight:'100vh', fontSize: `${t.fontSize * 16}px` }}>
      {view === 'dashboard' && (
        <Dashboard
          state={state}
          setState={setState}
          words={words}
          onStart={(level) => setView('session')}
        />
      )}
      {view === 'session' && (
        <Session
          words={words}
          state={state}
          setState={setState}
          mode={state.settings?.mode || 'flashcard'}
          level={state.settings?.level || 'A1'}
          onExit={() => setView('dashboard')}
        />
      )}

      <TweaksPanel title="Tweaks">
        <TweakSection label="Display"/>
        <TweakSlider label="Card font" value={t.fontSize} min={0.85} max={1.25} step={0.05}
          unit="" onChange={(v) => setTweak('fontSize', v)}/>
        <TweakRadio label="Paper tone" value={t.paperTone}
          options={['warm','cool','night']}
          onChange={(v) => setTweak('paperTone', v)}/>
        <TweakToggle label="Marginalia" value={t.showMarginalia}
          onChange={(v) => setTweak('showMarginalia', v)}/>
        <TweakSlider label="Rotation" value={t.cardRotation} min={0} max={2} step={0.25}
          unit="×" onChange={(v) => setTweak('cardRotation', v)}/>

        <TweakSection label="Session"/>
        <TweakRadio label="Mode" value={state.settings?.mode || 'flashcard'}
          options={['flashcard','choice','listen','cloze']}
          onChange={(v) => setSettings('mode', v)}/>
        <TweakRadio label="Level" value={state.settings?.level || 'A1'}
          options={['A1','A2','B1','B2']}
          onChange={(v) => setSettings('level', v)}/>
        <TweakNumber label="Daily goal" value={state.settings?.dailyGoal || 20}
          min={5} max={200} step={5} unit=" words"
          onChange={(v) => setSettings('dailyGoal', v)}/>

        <TweakSection label="Data"/>
        <TweakButton label="Reload word list" onClick={() => location.reload()}/>
        <TweakButton secondary label="Reset all progress" onClick={() => {
          if (confirm('Reset all progress, streaks, and stats? This cannot be undone.')) {
            localStorage.removeItem(window.VocabStore.KEY);
            location.reload();
          }
        }}/>
      </TweaksPanel>
    </div>
  );
};

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