// Dalflow — main app, router, layout (Nav + Footer)
// Loads content from window.DALFLOW_CONTENT and pages from window.DALFLOW_PAGES.

const { useState, useEffect, useMemo, useCallback } = React;

const ROUTES = [
  { key: 'home',     hash: '#/' },
  { key: 'services', hash: '#/services' },
  { key: 'cases',    hash: '#/cases' },
  { key: 'about',    hash: '#/about' },
  { key: 'contact',  hash: '#/contact' },
];

function getRouteFromHash() {
  const h = window.location.hash || '#/';
  const found = ROUTES.find(r => r.hash === h);
  return found ? found.key : 'home';
}

function useHashRoute() {
  const [route, setRoute] = useState(getRouteFromHash());
  useEffect(() => {
    const onHash = () => {
      setRoute(getRouteFromHash());
      // scroll to top on route change
      window.scrollTo({ top: 0, behavior: 'instant' });
    };
    window.addEventListener('hashchange', onHash);
    return () => window.removeEventListener('hashchange', onHash);
  }, []);
  return route;
}

// ===== Language context =====
function useLang() {
  const [lang, setLang] = useState(() => {
    return localStorage.getItem('dalflow-lang') || 'ca';
  });
  useEffect(() => {
    localStorage.setItem('dalflow-lang', lang);
    document.documentElement.lang = lang;
  }, [lang]);
  return [lang, setLang];
}

// ===== Nav =====
function Nav({ route, lang, setLang, t }) {
  const [open, setOpen] = useState(false);
  useEffect(() => { setOpen(false); }, [route]);

  const navItem = (key, hash) => (
    <a
      key={key}
      href={hash}
      className={`nav__link ${route === key ? 'nav__link--active' : ''}`}
    >
      {t.nav[key]}
    </a>
  );

  return (
    <>
      <nav className="nav">
        <a href="#/" className="nav__brand" aria-label="Dalflow home">
          <span className="wordmark">dal<span className="wordmark__ital">flow</span></span>
        </a>
        <div className="nav__links">
          {navItem('home', '#/')}
          {navItem('services', '#/services')}
          {navItem('cases', '#/cases')}
          {navItem('about', '#/about')}
          {navItem('contact', '#/contact')}
        </div>
        <div className="nav__spacer" />
        <div className="nav__lang" role="tablist" aria-label="Language">
          {['ca', 'es', 'en'].map(l => (
            <button
              key={l}
              className={lang === l ? 'active' : ''}
              onClick={() => setLang(l)}
              aria-label={l}
            >{l}</button>
          ))}
        </div>
        <a href="#/contact" className="btn btn--primary btn--sm" style={{ marginLeft: 6 }}>
          {t.nav.cta}
          <span className="arrow">→</span>
        </a>
        <button className="nav__mobile" onClick={() => setOpen(o => !o)} aria-label="menu">
          ☰
        </button>
      </nav>

      <div className={`nav__sheet ${open ? 'open' : ''}`}>
        <a href="#/" onClick={() => setOpen(false)}>{t.nav.home}</a>
        <a href="#/services" onClick={() => setOpen(false)}>{t.nav.services}</a>
        <a href="#/cases" onClick={() => setOpen(false)}>{t.nav.cases}</a>
        <a href="#/about" onClick={() => setOpen(false)}>{t.nav.about}</a>
        <a href="#/contact" onClick={() => setOpen(false)}>{t.nav.contact}</a>
        <div className="nav__lang">
          {['ca', 'es', 'en'].map(l => (
            <button key={l} className={lang === l ? 'active' : ''} onClick={() => setLang(l)}>{l}</button>
          ))}
        </div>
      </div>
    </>
  );
}

// ===== Footer =====
function Footer({ t }) {
  return (
    <footer className="footer">
      <div className="container">
        <div className="footer__row">
          <div className="footer__brand">
            <div className="footer__brand-mark">
              <span className="wordmark" style={{ fontSize: '22px' }}>dal<span className="wordmark__ital">flow</span></span>
            </div>
            <p className="muted" style={{ fontSize: 15, margin: 0 }}>{t.footer.tagline}</p>
            <a href="#/contact" className="btn btn--primary btn--sm" style={{ alignSelf: 'flex-start' }}>
              {t.footer.bookCall}
              <span className="arrow">→</span>
            </a>
          </div>

          <div className="footer__col">
            <h4>Dalflow</h4>
            <ul>
              <li><a href="#/">{t.nav.home}</a></li>
              <li><a href="#/services">{t.nav.services}</a></li>
              <li><a href="#/cases">{t.nav.cases}</a></li>
              <li><a href="#/about">{t.nav.about}</a></li>
              <li><a href="#/contact">{t.nav.contact}</a></li>
            </ul>
          </div>

          <div className="footer__col">
            <h4>Contact</h4>
            <ul>
              <li><a href="mailto:armand.dalmau@gmail.com">armand.dalmau@gmail.com</a></li>
              <li><a href="https://www.linkedin.com/in/armanddalmau/" target="_blank" rel="noreferrer">LinkedIn</a></li>
            </ul>
          </div>
        </div>
        <div className="footer__bottom">
          <span>{t.footer.copyright}</span>
          <span>v1.0 — Barcelona → Everywhere</span>
        </div>
      </div>
    </footer>
  );
}

// ===== App =====
function App() {
  const route = useHashRoute();
  const [lang, setLang] = useLang();
  const t = window.DALFLOW_CONTENT[lang];

  // Tweaks state
  const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
    "theme": "dalflow",
    "font": "geist",
    "showFinalCta": true,
    "heroVariant": "serif"
  }/*EDITMODE-END*/;
  const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);

  // Apply theme + font live via data attributes on <html>
  useEffect(() => {
    const html = document.documentElement;
    if (tweaks.theme && tweaks.theme !== 'dalflow') html.setAttribute('data-theme', tweaks.theme);
    else html.removeAttribute('data-theme');
  }, [tweaks.theme]);
  useEffect(() => {
    const html = document.documentElement;
    if (tweaks.font && tweaks.font !== 'geist') html.setAttribute('data-font', tweaks.font);
    else html.removeAttribute('data-font');
  }, [tweaks.font]);

  // Render the right page
  const pages = window.DALFLOW_PAGES;
  const PageComp = pages[route] || pages.home;

  return (
    <>
      <Nav route={route} lang={lang} setLang={setLang} t={t} />
      <main>
        <PageComp t={t} lang={lang} tweaks={tweaks} />
      </main>
      <Footer t={t} />
      <TweaksPanel title="Tweaks">
        <TweakSection label="Theme" />
        <TweakSelect
          label="Palette"
          value={tweaks.theme}
          options={[
            { value: 'dalflow',   label: 'Dalflow (lima · fosc)' },
            { value: 'editorial', label: 'Editorial (ambre · fosc)' },
            { value: 'paper',     label: 'Paper (crema · terracota)' },
            { value: 'cobalt',    label: 'Cobalt (blau elèctric)' },
            { value: 'terminal',  label: 'Terminal (verd fòsfor)' },
          ]}
          onChange={(v) => setTweak('theme', v)}
        />
        <TweakSelect
          label="Tipografia"
          value={tweaks.font}
          options={[
            { value: 'geist',   label: 'Geist (actual)' },
            { value: 'manrope', label: 'Manrope' },
            { value: 'dmsans',  label: 'DM Sans' },
            { value: 'jakarta', label: 'Plus Jakarta Sans' },
          ]}
          onChange={(v) => setTweak('font', v)}
        />
        <TweakRadio
          label="Hero style"
          value={tweaks.heroVariant}
          options={[
            { value: 'serif', label: 'Italic' },
            { value: 'sans',  label: 'Sans' },
          ]}
          onChange={(v) => setTweak('heroVariant', v)}
        />
        <TweakSection label="Sections" />
        <TweakToggle
          label="Final CTA block"
          value={tweaks.showFinalCta}
          onChange={(v) => setTweak('showFinalCta', v)}
        />
        <TweakSection label="Language" />
        <TweakRadio
          label="Language"
          value={lang}
          onChange={setLang}
          options={[
            { value: 'ca', label: 'CA' },
            { value: 'es', label: 'ES' },
            { value: 'en', label: 'EN' },
          ]}
        />
      </TweaksPanel>
    </>
  );
}

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