/* Nav · Hero · Marquee */

function Nav({ scrolled, active, onNav }) {
  const links = [
    ['about', 'Über uns'], ['services', 'Leistungen'], ['projects', 'Projekte'],
    ['process', 'Ablauf'], ['why', 'Warum wir'], ['contact', 'Kontakt'],
  ];
  const [menuOpen, setMenuOpen] = React.useState(false);

  React.useEffect(() => {
    const prev = document.body.style.overflow;
    if (menuOpen) document.body.style.overflow = 'hidden';
    else document.body.style.overflow = prev || '';
    const onKey = (e) => { if (e.key === 'Escape') setMenuOpen(false); };
    document.addEventListener('keydown', onKey);
    return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = prev || ''; };
  }, [menuOpen]);

  const go = (id) => { setMenuOpen(false); onNav(id); };

  return (
    <>
    <nav className={'nav' + (scrolled ? ' is-scrolled' : '') + (menuOpen ? ' is-menu-open' : '')}>
      <a className="brand" onClick={() => onNav('top')} style={{ cursor: 'pointer' }} aria-label="Ottoman Projekts">
        <img src="assets/logo-wordmark.png" alt="Ottoman Projekts" />
      </a>
      <div className="nav-links">
        {links.map(([id, txt]) => (
          <a key={id} className={active === id ? 'is-active' : ''} onClick={() => onNav(id)}>{txt}</a>
        ))}
      </div>
      <span className="nav-cta" onClick={() => onNav('contact')}>Projekt starten<span className="arrow"></span></span>
      <button
        type="button"
        className={'nav-burger' + (menuOpen ? ' is-open' : '')}
        aria-label={menuOpen ? 'Menü schließen' : 'Menü öffnen'}
        aria-expanded={menuOpen}
        aria-controls="mobile-menu"
        onClick={() => setMenuOpen(v => !v)}
      >
        <span></span><span></span><span></span>
      </button>
    </nav>

    <div
      id="mobile-menu"
      className={'mobile-menu' + (menuOpen ? ' is-open' : '')}
      aria-hidden={!menuOpen}
      role="dialog"
      aria-modal="true"
      onClick={() => setMenuOpen(false)}
    >
      <div className="mobile-menu-inner" onClick={(e) => e.stopPropagation()}>
        <ul className="mobile-menu-list">
          {links.map(([id, txt], i) => (
            <li key={id} style={{ '--i': i }}>
              <a
                className={active === id ? 'is-active' : ''}
                onClick={() => go(id)}
              >
                <span className="mm-ix">{String(i + 1).padStart(2, '0')}</span>
                <span className="mm-label">{txt}</span>
                <span className="mm-arrow" aria-hidden="true">→</span>
              </a>
            </li>
          ))}
        </ul>
        <div className="mobile-menu-foot" style={{ '--i': links.length }}>
          <a className="btn btn-primary mm-cta" onClick={() => go('contact')}>
            <span className="dot"></span>Projekt starten
          </a>
          <div className="mm-contact">
            <a href="mailto:info@ottoman.pro">info@ottoman.pro</a>
            <span>Freiligrathstr. 25 · 41238 Mönchengladbach</span>
          </div>
        </div>
      </div>
    </div>
    </>
  );
}

function Hero({ onNav }) {
  return (
    <section className="hero" data-screen-label="Hero" id="top">
      <div className="hero-bg-grid" aria-hidden="true"></div>
      <div className="container hero-inner">
        <div className="hero-copy">
          <div data-reveal><span className="eyebrow">Bau · Sanierung · Service</span></div>
          <h1 data-reveal style={{ '--reveal-delay': '120ms' }}>
            <span className="frag">Wir bauen,</span>
            <span className="frag frag-2"><em>was bleibt.</em></span>
          </h1>
          <div className="hero-actions" data-reveal style={{ '--reveal-delay': '380ms' }}>
            <a className="btn btn-primary" onClick={() => onNav('contact')}><span className="dot"></span>Projekt starten</a>
            <a className="btn btn-ghost" onClick={() => onNav('services')}>Leistungen ansehen</a>
          </div>
        </div>

        <HeroVideo />
      </div>
    </section>
  );
}

/* Scroll-scrubbed, frame-by-frame cinematic hero video.
   currentTime is driven by scroll progress and eased toward the
   target each frame so seeking feels smooth rather than steppy. */
function HeroVideo() {
  const videoRef = React.useRef(null);
  const [progress, setProgress] = React.useState(0);

  React.useEffect(() => {
    const v = videoRef.current;
    if (!v) return;

    let dur = 0, ready = false;
    let target = 0, current = 0;

    const computeProgress = () => {
      const hero = document.getElementById('top');
      if (!hero) return 0;
      const rect = hero.getBoundingClientRect();
      // Scrub through the whole clip over the first ~90% of a viewport
      // of scroll, finishing while the video is still on screen.
      const range = Math.max(window.innerHeight * 0.9, 1);
      const scrolled = Math.min(Math.max(-rect.top, 0), range);
      return scrolled / range;
    };

    const seek = (p) => { if (ready) { try { v.currentTime = p * dur; } catch (e) {} } };

    // rAF smoothing eases the seek between scroll events for buttery
    // motion. If rAF is throttled (backgrounded tab), the scroll handler
    // still seeks directly, so playback never stalls.
    let rafId = 0;
    const tick = () => {
      current += (target - current) * 0.18;
      if (Math.abs(target - current) < 0.0005) { current = target; rafId = 0; return; }
      seek(current);
      rafId = requestAnimationFrame(tick);
    };

    const onScroll = () => {
      target = computeProgress();
      setProgress(target);
      seek(target);                                   // direct, always works
      if (!rafId) rafId = requestAnimationFrame(tick); // smooth if available
    };

    const onMeta = () => { dur = v.duration || 8; ready = true; current = target = computeProgress(); seek(current); setProgress(current); };
    if (v.readyState >= 1) onMeta();
    v.addEventListener('loadedmetadata', onMeta);

    // iOS/Safari only allow seeking after a (muted) play gesture.
    const pr = v.play(); if (pr && pr.catch) pr.then(() => v.pause()).catch(() => {});

    window.addEventListener('scroll', onScroll, { passive: true });
    window.addEventListener('resize', onScroll);
    onScroll();

    return () => {
      window.removeEventListener('scroll', onScroll);
      window.removeEventListener('resize', onScroll);
      v.removeEventListener('loadedmetadata', onMeta);
      if (rafId) cancelAnimationFrame(rafId);
    };
  }, []);

  return (
    <div className="hero-video-stage" data-reveal style={{ '--reveal-delay': '200ms' }} aria-hidden="true">
      <div className="colosseum-glow"></div>
      <div className="hero-video-frame">
        <video
          ref={videoRef}
          className="hero-video"
          src="hero-roman.mp4"
          muted
          playsInline
          preload="auto"
          tabIndex={-1}
        ></video>
        <div className="hero-video-vignette"></div>
        <div className="hero-video-grain"></div>
        <div className="hero-video-scrub"><span style={{ transform: `scaleX(${progress})` }}></span></div>
      </div>
      <div className="colosseum-caption">Colosseum · Zerfall &amp; Wiederaufbau</div>
    </div>
  );
}

/* Three concentric rotating rings + a ring of orange "stones". */
function Colosseum() {
  const stones = Array.from({ length: 24 });
  return (
    <React.Fragment>
      <div className="col-ring r1"></div>
      <div className="col-ring r2"></div>
      <div className="col-ring r3">
        {stones.map((_, i) => (
          <span key={i} className="col-tick" style={{
            transform: `translate(-50%, 0) rotate(${(360 / stones.length) * i}deg) translateY(-2px)`,
            opacity: 0.35 + (i % 5) * 0.12,
          }}></span>
        ))}
      </div>
    </React.Fragment>
  );
}

function Marquee() {
  const words = ['Abriss', 'Entkernung', 'Sanierung', 'Renovierung', 'Trockenbau', 'Malerarbeiten', 'Bodenarbeiten', 'Reinigung'];
  const all = [...words, ...words];
  return (
    <div className="marquee" aria-hidden="true">
      <div className="marquee-track">
        {all.map((w, i) => <span key={i}>{w}</span>)}
      </div>
    </div>
  );
}

Object.assign(window, { Nav, Hero, Marquee });
