/* global React, ReactDOM, PALETTES, Nav, Footer, HomePage, AboutPage, ServicesPage, ContactPage,
   TweaksPanel, useTweaks, TweakSection, TweakColor, TweakRadio, TweakToggle, TweakSlider */
const { useState, useEffect } = React;

const TWEAK_DEFAULS = /*EDITMODE-BEGIN*/{
  "palette": "sage",
  "fontPair": "cormorant-jost",
  "density": "comfortable",
  "specInspector": false
}/*EDITMODE-END*/;

/* Font pairings — also useful to a developer. */
const FONT_PAIRS = {
  'cormorant-jost':   { serif: "'Cormorant Garamond', Georgia, serif", sans: "'Jost', 'Helvetica Neue', sans-serif", label: 'Cormorant / Jost' },
  'fraunces-inter':   { serif: "'Fraunces', Georgia, serif",            sans: "'Inter', system-ui, sans-serif",       label: 'Fraunces / Inter' },
  'playfair-work':    { serif: "'Playfair Display', Georgia, serif",    sans: "'Work Sans', system-ui, sans-serif",   label: 'Playfair / Work Sans' },
  'libre-helvetica':  { serif: "'Libre Caslon Text', Georgia, serif",   sans: "'Helvetica Neue', Helvetica, sans-serif", label: 'Libre Caslon / Helvetica' },
};

const DENSITY = {
  cozy:        { gutter: '40px',  navH: '72px',  baseFs: '15px' },
  comfortable: { gutter: '56px',  navH: '83px',  baseFs: '16px' },
  spacious:    { gutter: '80px',  navH: '96px',  baseFs: '17px' },
};

/* ─────────────────────────────────────────────────────────
   Spec-inspector tooltip (developer aid)
   ───────────────────────────────────────────────────────── */
function SpecInspector({ on }) {
  const [tip, setTip] = useState(null);
  useEffect(() => {
    if (!on) { setTip(null); return; }
    document.body.classList.add('spec-on');
    const onOver = (e) => {
      const t = e.target.closest('[data-spec]');
      if (!t) { setTip(null); return; }
      const r = t.getBoundingClientRect();
      setTip({ text: t.getAttribute('data-spec'), x: r.left, y: r.bottom + 6 });
    };
    const onLeave = () => setTip(null);
    document.addEventListener('mouseover', onOver);
    document.addEventListener('mouseout', onLeave);
    return () => {
      document.body.classList.remove('spec-on');
      document.removeEventListener('mouseover', onOver);
      document.removeEventListener('mouseout', onLeave);
    };
  }, [on]);
  if (!on || !tip) return null;
  const left = Math.min(tip.x, window.innerWidth - 320);
  return <div className="spec-tip" style={{ left, top: tip.y }}>{tip.text}</div>;
}

/* ─────────────────────────────────────────────────────────
   App
   ───────────────────────────────────────────────────────── */
function App() {
  const [page, setPage] = useState('home');
  const [mobileOpen, setMobileOpen] = useState(false);
  const [t, setTweak] = useTweaks(TWEAK_DEFAULS);

  // Apply palette tokens to <body>
  useEffect(() => {
    const palette = PALETTES.find((p) => p.id === t.palette) || PALETTES[0];
    Object.entries(palette.tokens).forEach(([k, v]) => {
      document.documentElement.style.setProperty(k, v);
    });
  }, [t.palette]);

  // Apply font pair
  useEffect(() => {
    const fp = FONT_PAIRS[t.fontPair] || FONT_PAIRS['cormorant-jost'];
    document.documentElement.style.setProperty('--serif', fp.serif);
    document.documentElement.style.setProperty('--sans', fp.sans);
  }, [t.fontPair]);

  // Apply density
  useEffect(() => {
    const d = DENSITY[t.density] || DENSITY.comfortable;
    document.documentElement.style.setProperty('--gutter', d.gutter);
    document.documentElement.style.setProperty('--nav-h', d.navH);
    document.body.style.fontSize = d.baseFs;
  }, [t.density]);

  const go = (p) => {
    setPage(p);
    setMobileOpen(false);
    window.scrollTo({ top: 0, behavior: 'instant' });
  };

  const Page = { home: HomePage, about: AboutPage, services: ServicesPage, contact: ContactPage }[page];

  return (
    <>
      <Nav page={page} go={go} mobileOpen={mobileOpen} setMobileOpen={setMobileOpen} />
      <main key={page}>
        <Page go={go} />
      </main>
      <Footer go={go} />

      <SpecInspector on={t.specInspector} />

      <TweaksPanel title="Tweaks">
        <TweakSection label="Colour Scheme">
          <PaletteGrid
            value={t.palette}
            onChange={(v) => setTweak('palette', v)}
          />
        </TweakSection>

        <TweakSection label="Typography">
          <TweakRadio
            label="Pairing"
            value={t.fontPair}
            onChange={(v) => setTweak('fontPair', v)}
            options={Object.entries(FONT_PAIRS).map(([id, f]) => ({ value: id, label: f.label }))}
          />
        </TweakSection>

        <TweakSection label="Layout">
          <TweakRadio
            label="Density"
            value={t.density}
            onChange={(v) => setTweak('density', v)}
            options={['cozy', 'comfortable', 'spacious']}
          />
        </TweakSection>

        <TweakSection label="Developer Tools">
          <TweakToggle
            label="Spec inspector"
            value={t.specInspector}
            onChange={(v) => setTweak('specInspector', v)}
          />
        </TweakSection>
      </TweaksPanel>
    </>
  );
}

/* ─────────────────────────────────────────────────────────
   PaletteGrid — bespoke control: shows actual surface + ink + accent
   per palette so the choice is concrete, not abstract.
   ───────────────────────────────────────────────────────── */
function PaletteGrid({ value, onChange }) {
  return (
    <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: 8 }}>
      {PALETTES.map((p) => {
        const selected = p.id === value;
        return (
          <button
            key={p.id}
            onClick={() => onChange(p.id)}
            style={{
              textAlign: 'left',
              padding: 10,
              borderRadius: 8,
              border: selected ? '1.5px solid #1f1f1f' : '1px solid rgba(0,0,0,.1)',
              background: '#fff',
              cursor: 'pointer',
              fontFamily: 'inherit',
              boxShadow: selected ? '0 0 0 3px rgba(31,31,31,.08)' : 'none',
              transition: 'box-shadow .2s, border-color .2s',
            }}
          >
            <div style={{ display: 'flex', gap: 4, marginBottom: 8 }}>
              <div style={{ flex: 1, height: 28, background: p.tokens['--ivory'], borderRadius: 3, border: '1px solid rgba(0,0,0,.04)' }} />
              <div style={{ flex: 1, height: 28, background: p.tokens['--sage'], borderRadius: 3 }} />
              <div style={{ flex: 1, height: 28, background: p.tokens['--charcoal'], borderRadius: 3 }} />
            </div>
            <div style={{ fontSize: 12, fontWeight: 600, color: '#1f1f1f' }}>{p.label}</div>
            <div style={{ fontSize: 10, color: '#6b6b6b', marginTop: 2, lineHeight: 1.35 }}>{p.note}</div>
          </button>
        );
      })}
    </div>
  );
}

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