// ============================================
// BELERATE — Main App
// ============================================

const { useState, useEffect, useRef, useCallback, Fragment } = React;

// ---------- Magnetic Button wrapper (disabled per feedback) ----------
function Magnetic({ children }) {
  return <>{children}</>;
}

// ---------- Scroll Reveal ----------
function useReveal(loaded, lang) {
  useEffect(() => {
    if (!loaded) return;
    document.documentElement.classList.add('js-reveal-ready');

    const check = () => {
      const vh = window.innerHeight;
      document.querySelectorAll('.reveal:not(.in), .reveal-stagger:not(.in), .split-reveal:not(.in)').forEach(el => {
        const r = el.getBoundingClientRect();
        // Trigger when top is within 1.2× viewport (pre-trigger just below fold)
        if (r.top < vh * 1.2 && r.bottom > -200) el.classList.add('in');
      });
    };

    // Initial pass — reveal everything near or above viewport
    check();
    // Run a few times in case layout shifts from fonts/images
    const timers = [50, 200, 500, 1000].map(d => setTimeout(check, d));

    let rafId;
    const onScroll = () => {
      if (rafId) return;
      rafId = requestAnimationFrame(() => { rafId = 0; check(); });
    };
    window.addEventListener('scroll', onScroll, { passive: true });
    window.addEventListener('resize', onScroll);

    return () => {
      window.removeEventListener('scroll', onScroll);
      window.removeEventListener('resize', onScroll);
      timers.forEach(clearTimeout);
    };
  }, [loaded, lang]);
}

// ---------- Counter animation ----------
function Counter({ to, duration = 1800, suffix = '' }) {
  const [val, setVal] = useState(0);
  const ref = useRef(null);
  const started = useRef(false);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const io = new IntersectionObserver((entries) => {
      if (entries[0].isIntersecting && !started.current) {
        started.current = true;
        const start = performance.now();
        const step = (t) => {
          const p = Math.min((t - start) / duration, 1);
          const eased = 1 - Math.pow(1 - p, 3);
          setVal(Math.round(to * eased));
          if (p < 1) requestAnimationFrame(step);
        };
        requestAnimationFrame(step);
        io.disconnect();
      }
    }, { threshold: 0.5 });
    io.observe(el);
    return () => io.disconnect();
  }, [to, duration]);
  return <span ref={ref}>{val}{suffix}</span>;
}

// ---------- Loader ----------
function Loader({ done }) {
  return (
    <div className={'loader' + (done ? ' done' : '')}>
      <div className="loader__inner">
        <img className="loader__logo" src="assets/belerate-logo.png" alt="Belerate"/>
        <div className="loader__bar"><div className="loader__bar-fill"/></div>
        <div className="loader__label">Belerate / Studio</div>
      </div>
    </div>
  );
}

// ---------- Nav ----------
function Nav({ lang, setLang, t }) {
  const [scrolled, setScrolled] = useState(false);
  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 20);
    window.addEventListener('scroll', onScroll);
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return (
    <nav className={'nav' + (scrolled ? ' scrolled' : '')}>
      <a className="nav__brand" href="#top">
        <img src="assets/belerate-logo.png" alt="Belerate"/>
        <span>Belerate</span>
      </a>
      <div className="nav__menu">
        <a href="#services">{t.nav.services}</a>
        <a href="#work">{t.nav.work}</a>
        <a href="#process">{t.nav.process}</a>
        <a href="#contact">{t.nav.contact}</a>
      </div>
      <div className="nav__right">
        <div className="lang-toggle">
          <button className={lang === 'de' ? 'active' : ''} onClick={() => setLang('de')}>DE</button>
          <button className={lang === 'en' ? 'active' : ''} onClick={() => setLang('en')}>EN</button>
        </div>
        <Magnetic>
          <a href="https://cal.com/belerate" target="_blank" rel="noopener" className="btn btn--primary">
            {t.nav.cta}
            <svg className="arrow" viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4"><path d="M4 14L14 4M14 4H7M14 4V11"/></svg>
          </a>
        </Magnetic>
      </div>
    </nav>
  );
}

// ---------- Hero ----------
function Hero({ t, lang }) {
  const [time, setTime] = useState('');
  useEffect(() => {
    const update = () => {
      const d = new Date();
      const h = d.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit', timeZone: 'Europe/Berlin' });
      setTime(h + ' MUC');
    };
    update();
    const id = setInterval(update, 30000);
    return () => clearInterval(id);
  }, []);

  return (
    <section className="hero container" id="top">
      <div className="hero__top">
        <div className="hero__meta">
          <div className="hero__meta-row">
            <span><span className="dot"/> {t.hero.status}</span>
          </div>
          <div className="hero__meta-row">
            <span>{t.hero.location}</span>
            <span>{time}</span>
          </div>
        </div>
      </div>

      <h1 className="hero__headline reveal">
        {lang === 'de' ? (
          <>Websites, die <span className="it">verkaufen.</span><br/><span className="dim">Nicht nur</span> gefallen.</>
        ) : (
          <>Websites that <span className="it">sell.</span><br/><span className="dim">Not just</span> look nice.</>
        )}
      </h1>

      <div className="hero__bottom">
        <p className="hero__lead reveal" style={{transitionDelay: '.2s'}}>{t.hero.lead}</p>
        <div className="hero__actions reveal" style={{transitionDelay: '.35s'}}>
          <Magnetic>
            <a href="https://cal.com/belerate" target="_blank" rel="noopener" className="btn btn--primary">
              {t.hero.cta1}
              <svg className="arrow" viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4"><path d="M4 14L14 4M14 4H7M14 4V11"/></svg>
            </a>
          </Magnetic>
          <Magnetic strength={0.2}>
            <a href="#work" className="btn btn--ghost">
              {t.hero.cta2}
              <svg className="arrow" viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4"><path d="M4 9H14M14 9L10 5M14 9L10 13"/></svg>
            </a>
          </Magnetic>
        </div>
      </div>

      <div className="hero__scroll">
        <span>{t.hero.scroll}</span>
        <div className="hero__scroll-line"/>
      </div>
    </section>
  );
}

// ---------- Marquee ----------
function Marquee({ items }) {
  const track = (
    <div className="marquee__track">
      {items.map((item, i) => <div className="marquee__item" key={i}>{item}</div>)}
    </div>
  );
  return (
    <div className="marquee">
      {track}
      {track}
      {track}
    </div>
  );
}

// ---------- Section Head ----------
function SectionHead({ label, title, intro }) {
  return (
    <div className="section-head">
      <div className="section-head__label">
        <span className="num">{label}</span>
      </div>
      <div>
        <h2 className="section-head__title reveal">{title}</h2>
        {intro && <p className="reveal" style={{marginTop: 24, maxWidth: '52ch', color: 'var(--fg-dim)', fontSize: 16, lineHeight: 1.55, transitionDelay: '.1s'}}>{intro}</p>}
      </div>
    </div>
  );
}

// ---------- Services ----------
function Services({ t }) {
  return (
    <section id="services" className="container">
      <SectionHead label={t.services.label} title={t.services.title} intro={t.services.intro}/>
      <div className="services__grid">
        {t.services.items.map((s, i) => (
          <div className="service reveal" key={i} style={{transitionDelay: `${i * 0.08}s`}}>
            <div className="service__num">/{s.num}</div>
            <h3 className="service__title">{s.title}</h3>
            <div className="service__body">
              <p className="service__desc">{s.desc}</p>
              <div className="service__tags">
                {s.tags.map((tag, j) => <span className="service__tag" key={j}>{tag}</span>)}
              </div>
            </div>
            <div className="service__arrow">
              <svg width="16" height="16" viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4"><path d="M4 14L14 4M14 4H7M14 4V11"/></svg>
            </div>
          </div>
        ))}
      </div>
    </section>
  );
}

// ---------- Cases ----------
function Cases({ t }) {
  return (
    <section id="work" className="container">
      <SectionHead label={t.cases.label} title={t.cases.title} intro={t.cases.intro}/>
      <div className="cases__grid">
        {t.cases.items.map((c, i) => {
          if (c.isNew) {
            return (
              <a href="https://cal.com/belerate" target="_blank" rel="noopener" className="case case--new reveal" key={c.id} style={{transitionDelay: `${i*0.05}s`, gridColumn: 'span 6'}}>
                <div className="case__media">
                  <div className="case__mock">
                    <div className="plus">+</div>
                    <div className="lbl">Your project / 2026</div>
                  </div>
                </div>
                <div className="case__meta">
                  <div className="case__info">
                    <h3 className="case__title">{c.title}</h3>
                    <div className="case__sub">{c.sub}</div>
                  </div>
                  <div className="case__year">{c.year}</div>
                </div>
              </a>
            );
          }
          const cls = 'case reveal' + (c.wide ? ' case--wide' : c.tall ? ' case--tall' : '');
          return (
            <a href={c.url} target="_blank" rel="noopener" className={cls} key={c.id} style={{transitionDelay: `${i*0.05}s`}}>
              <div className="case__media">
                <div className="case__media-inner case__titleblock">
                  <div className="case__titleblock-name">{c.title}</div>
                  <div className="case__titleblock-host">{(c.url || '').replace(/^https?:\/\//, '').replace(/\/$/, '')}</div>
                </div>
                <div className="case__overlay">
                  <div className="case__view-btn">
                    <span>{t.cases.viewCase}</span>
                    <svg width="12" height="12" viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4"><path d="M4 14L14 4M14 4H7M14 4V11"/></svg>
                  </div>
                </div>
              </div>
              <div className="case__meta">
                <div className="case__info">
                  <h3 className="case__title">{c.title}</h3>
                  <div className="case__sub">{c.sub}</div>
                  <div className="case__tags">
                    {c.tags.map((tag, j) => <span className="case__tag" key={j}>{tag}</span>)}
                  </div>
                </div>
                <div className="case__year">{c.year}</div>
              </div>
            </a>
          );
        })}
      </div>
    </section>
  );
}

// ---------- Process ----------
function Process({ t }) {
  return (
    <section id="process" className="process">
      <div className="container">
        <SectionHead label={t.process.label} title={t.process.title} intro={t.process.intro}/>
      </div>
      <div className="process__steps">
        {t.process.steps.map((s, i) => (
          <div className="step reveal" key={i} style={{transitionDelay: `${i * 0.08}s`}}>
            <div className="step__num">{s.num}</div>
            <h3 className="step__title">{s.title}</h3>
            <p className="step__desc">{s.desc}</p>
            <div className="step__duration">
              <span>{s.scope}</span>
              <span>{s.duration}</span>
            </div>
          </div>
        ))}
      </div>
    </section>
  );
}

// ---------- FAQ ----------
function FAQ({ t }) {
  const [open, setOpen] = useState(0);
  return (
    <section className="container" id="faq">
      <SectionHead label={t.faq.label} title={t.faq.title}/>
      <div className="faq">
        {t.faq.items.map((item, i) => (
          <div className={'faq__item' + (open === i ? ' open' : '')} key={i} onClick={() => setOpen(open === i ? -1 : i)}>
            <div className="faq__q">
              <div className="faq__q-text">{item.q}</div>
              <div className="faq__icon">+</div>
            </div>
            <div className="faq__a">{item.a}</div>
          </div>
        ))}
      </div>
    </section>
  );
}

// ---------- CTA ----------
function CTA({ t }) {
  const [email, setEmail] = useState('');
  const [sent, setSent] = useState(false);
  return (
    <section className="cta container" id="contact">
      <div className="cta__label reveal">— {t.cta.label} —</div>
      <h2 className="cta__headline reveal" style={{transitionDelay: '.1s'}}>{t.cta.headline}</h2>
      <p className="cta__sub reveal" style={{transitionDelay: '.2s'}}>{t.cta.sub}</p>
      <div className="cta__actions reveal" style={{transitionDelay: '.3s'}}>
        <Magnetic>
          <a href="https://cal.com/belerate" target="_blank" rel="noopener" className="btn btn--primary btn--lg">
            {t.cta.book}
            <svg className="arrow" viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4"><path d="M4 14L14 4M14 4H7M14 4V11"/></svg>
          </a>
        </Magnetic>
      </div>
      <div className="cta__meta reveal" style={{transitionDelay: '.4s'}}>
        <span><span className="dot"/>{t.cta.status1}</span>
        <span>{t.cta.status2}</span>
      </div>
    </section>
  );
}

// ---------- Footer ----------
function Footer({ t }) {
  return (
    <footer>
      <div className="container">
        <div className="footer__wordmark reveal">
          Bel<span className="it">erate</span>
        </div>
        <div className="footer__top">
          <div className="footer__brand">
            <div className="footer__brand-top">
              <img src="assets/belerate-logo.png" alt="Belerate"/>
              <span>Belerate</span>
            </div>
            <p>{t.footer.tagline}</p>
          </div>
          {t.footer.cols.map((col, i) => (
            <div className="footer__col" key={i}>
              <h4>{col.title}</h4>
              <ul>
                {col.links.map((link, j) => <li key={j}><a href="#">{link}</a></li>)}
              </ul>
            </div>
          ))}
        </div>
        <div className="footer__bottom">
          <span>{t.footer.bottom}</span>
          <span>{t.footer.bottom2}</span>
        </div>
      </div>
    </footer>
  );
}

// ---------- Tweaks Panel ----------
function Tweaks({ active, settings, setSettings }) {
  if (!active) return null;
  const setTheme = (v) => { setSettings({ ...settings, theme: v }); window.parent.postMessage({type:'__edit_mode_set_keys', edits:{theme: v}}, '*'); };
  const setTypo = (v) => { setSettings({ ...settings, typo: v }); window.parent.postMessage({type:'__edit_mode_set_keys', edits:{typo: v}}, '*'); };
  const setGrain = (v) => { setSettings({ ...settings, grain: v }); window.parent.postMessage({type:'__edit_mode_set_keys', edits:{grain: v}}, '*'); };
  return (
    <div className={'tweaks active'}>
      <h4>Tweaks</h4>
      <div className="tweaks__row">
        <div className="tweaks__label">Theme</div>
        <div className="tweaks__swatches">
          <div className={'tweaks__swatch' + (settings.theme==='green' ? ' active' : '')} style={{background:'#1E3A32'}} onClick={() => setTheme('green')}/>
          <div className={'tweaks__swatch' + (settings.theme==='cream' ? ' active' : '')} style={{background:'#EDE9D8', borderColor: settings.theme==='cream' ? '#1E3A32' : 'transparent'}} onClick={() => setTheme('cream')}/>
          <div className={'tweaks__swatch' + (settings.theme==='black' ? ' active' : '')} style={{background:'#0D0D0D'}} onClick={() => setTheme('black')}/>
        </div>
      </div>
      <div className="tweaks__row">
        <div className="tweaks__label">Display Type</div>
        <div className="tweaks__options">
          <button className={'tweaks__opt' + (settings.typo==='serif' ? ' active' : '')} onClick={() => setTypo('serif')}>Serif</button>
          <button className={'tweaks__opt' + (settings.typo==='sans' ? ' active' : '')} onClick={() => setTypo('sans')}>Sans</button>
        </div>
      </div>
      <div className="tweaks__row">
        <div className="tweaks__label">Grain Texture</div>
        <div className="tweaks__options">
          <button className={'tweaks__opt' + (settings.grain ? ' active' : '')} onClick={() => setGrain(true)}>On</button>
          <button className={'tweaks__opt' + (!settings.grain ? ' active' : '')} onClick={() => setGrain(false)}>Off</button>
        </div>
      </div>
    </div>
  );
}

// ---------- App ----------
function App({ defaults }) {
  const [lang, setLang] = useState(() => localStorage.getItem('belerate-lang') || 'de');
  const [loaded, setLoaded] = useState(false);
  const [settings, setSettings] = useState(defaults);
  const [tweakActive, setTweakActive] = useState(false);

  useEffect(() => { localStorage.setItem('belerate-lang', lang); }, [lang]);

  useEffect(() => {
    const timer = setTimeout(() => setLoaded(true), 1800);
    return () => clearTimeout(timer);
  }, []);

  useEffect(() => {
    document.documentElement.setAttribute('data-theme', settings.theme);
    document.documentElement.setAttribute('data-typo', settings.typo);
    document.body.classList.toggle('grain', settings.grain);
  }, [settings]);

  useEffect(() => {
    const handle = (e) => {
      if (e.data?.type === '__activate_edit_mode') setTweakActive(true);
      if (e.data?.type === '__deactivate_edit_mode') setTweakActive(false);
    };
    window.addEventListener('message', handle);
    window.parent.postMessage({type: '__edit_mode_available'}, '*');
    return () => window.removeEventListener('message', handle);
  }, []);

  useReveal(loaded, lang);

  const t = CONTENT[lang];

  return (
    <>
      <Loader done={loaded}/>
      <Nav lang={lang} setLang={setLang} t={t}/>
      <Hero t={t} lang={lang}/>
      <Marquee items={t.marquee}/>
      <Services t={t}/>
      <Cases t={t}/>
      <Process t={t}/>
      <FAQ t={t}/>
      <CTA t={t}/>
      <Footer t={t}/>
      <Tweaks active={tweakActive} settings={settings} setSettings={setSettings}/>
    </>
  );
}

window.App = App;
window.Magnetic = Magnetic;
