/* global React */
const { useState, useEffect } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "system",
  "accent": "auto",
  "numerals": "drop",
  "orient": "horizontal",
  "footer": "branded",
  "displayWeight": 300,
  "wonk": 1,
  "rule": 0.5
}/*EDITMODE-END*/;

function KrlTweaks() {
  const [t, setTweak] = window.useTweaks(TWEAK_DEFAULTS);

  // Apply tweaks to <body> attributes / CSS vars
  useEffect(() => {
    const b = document.body;
    b.dataset.theme = t.theme;
    b.dataset.accent = t.accent;
    b.dataset.numerals = t.numerals;
    // Orient: respect responsive override on mobile. The user's preference is preserved
    // on data-orient-pref so it kicks back in when the viewport widens.
    b.dataset.orientPref = t.orient;
    b.dataset.orient = (window.innerWidth <= 560) ? 'vertical' : t.orient;
    b.dataset.footer = t.footer;
    b.style.setProperty('--t-display-weight', String(t.displayWeight));
    b.style.setProperty('--t-wonk', String(t.wonk));
    b.style.setProperty('--t-rule-w', t.rule + 'px');
  }, [t]);

  // Auto accent: when accent is "auto", track theme (and OS pref if theme=system).
  // Dark → blue, Light → oxblood. CSS handles this via [data-accent="auto"] selectors,
  // but we also keep a data-accent-resolved attribute synced for any JS that reads it.
  useEffect(() => {
    if (t.accent !== 'auto') {
      document.body.dataset.accentResolved = t.accent;
      return;
    }
    const mq = window.matchMedia('(prefers-color-scheme: dark)');
    const resolve = () => {
      const dark = t.theme === 'dark' || (t.theme === 'system' && mq.matches);
      document.body.dataset.accentResolved = dark ? 'blue' : 'oxblood';
    };
    resolve();
    if (t.theme === 'system') {
      mq.addEventListener('change', resolve);
      return () => mq.removeEventListener('change', resolve);
    }
  }, [t.accent, t.theme]);

  const {
    TweaksPanel, TweakSection, TweakRadio, TweakSelect, TweakSlider, TweakToggle,
  } = window;

  return (
    <TweaksPanel title="Tweaks">
      <TweakSection label="Theme" />
      <TweakRadio label="Mode" value={t.theme}
        options={[
          {value:'system',label:'System'},
          {value:'light',label:'Light'},
          {value:'dark',label:'Dark'},
        ]}
        onChange={(v) => setTweak('theme', v)} />
      <TweakRadio label="Accent" value={t.accent}
        options={[
          {value:'auto',label:'Auto'},
          {value:'oxblood',label:'Oxblood'},
          {value:'blue',label:'Blue'},
          {value:'gold',label:'Gold'},
        ]}
        onChange={(v) => setTweak('accent', v)} />

      <TweakSection label="Editorial" />
      <TweakSelect label="Numerals" value={t.numerals}
        options={[
          {value:'small',label:'Small (22px)'},
          {value:'drop',label:'Drop italic'},
          {value:'mono',label:'Mono code'},
        ]}
        onChange={(v) => setTweak('numerals', v)} />
      <TweakSlider label="Display weight" value={t.displayWeight}
        min={200} max={500} step={10}
        onChange={(v) => setTweak('displayWeight', v)} />
      <TweakSlider label="Wonk italic" value={t.wonk}
        min={0} max={1} step={0.05}
        onChange={(v) => setTweak('wonk', v)} />

      <TweakSection label="Ledger" />
      <TweakRadio label="Orientation" value={t.orient}
        options={[{value:'horizontal',label:'Horiz.'},{value:'vertical',label:'Vert.'}]}
        onChange={(v) => setTweak('orient', v)} />

      <TweakSection label="Lines" />
      <TweakSlider label="Rule weight" value={t.rule}
        min={0} max={1.5} step={0.25} unit="px"
        onChange={(v) => setTweak('rule', v)} />
      <TweakRadio label="Footer" value={t.footer}
        options={[{value:'minimal',label:'Minimal'},{value:'branded',label:'Branded'}]}
        onChange={(v) => setTweak('footer', v)} />
    </TweaksPanel>
  );
}

const root = document.createElement('div');
document.body.appendChild(root);
ReactDOM.createRoot(root).render(<KrlTweaks />);
