// EYEQ — Chrome (nav, letterbox, HUD, grain, marquee, iris)

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

// ── Letterbox bars that respond to scroll ────────────────────────
function Letterbox() {
  useEffect(() => {
    const onScroll = () => {
      const y = window.scrollY;
      const vh = window.innerHeight;
      // 0 in hero, grows to 56px as you pass hero, stays through gallery,
      // tapers off after gallery section
      const heroEnd = vh * 0.9;
      const galleryStart = vh * 1.4;
      const galleryEnd = vh * 5.2;
      let lb = 0;
      if (y > heroEnd && y < galleryStart) {
        lb = Math.min(56, ((y - heroEnd) / (galleryStart - heroEnd)) * 56);
      } else if (y >= galleryStart && y < galleryEnd) {
        lb = 56;
      } else if (y >= galleryEnd) {
        lb = Math.max(0, 56 - ((y - galleryEnd) / vh) * 56);
      }
      // mobile: cap letterbox smaller so it doesn't eat the viewport
      if (window.innerWidth < 720) lb = Math.min(lb, 28);
      document.documentElement.style.setProperty('--letterbox', `${lb}px`);
    };
    window.addEventListener('scroll', onScroll, { passive: true });
    window.addEventListener('resize', onScroll, { passive: true });
    onScroll();
    return () => {
      window.removeEventListener('scroll', onScroll);
      window.removeEventListener('resize', onScroll);
    };
  }, []);
  return (
    <>
      <div className="letterbox-top" />
      <div className="letterbox-bot" />
    </>
  );
}

// ── Camera zoom-in: scroll-linked scale on flagged elements ───────
function CameraZoom() {
  useEffect(() => {
    const items = Array.from(document.querySelectorAll('[data-camera-zoom]'));
    if (!items.length) return;
    const update = () => {
      const vh = window.innerHeight;
      for (const el of items) {
        const r = el.getBoundingClientRect();
        // 0 when section is far below viewport; 1 when section is near top.
        const start = vh;       // section bottom touches viewport bottom
        const end = -r.height * 0.4; // section is well-scrolled-past
        let p = (start - r.top) / (start - end);
        p = Math.max(0, Math.min(1, p));
        const scale = 1.0 + p * 0.18;        // zoom 0 → 18%
        const translate = -p * 4;            // slight upward drift
        const blur = p < 0.05 ? (0.05 - p) * 24 : 0; // brief motion blur at start
        el.style.transform = `scale(${scale.toFixed(3)}) translateY(${translate.toFixed(1)}%)`;
        el.style.filter = blur > 0 ? `blur(${blur.toFixed(1)}px)` : '';
      }
    };
    let raf;
    const onScroll = () => {
      if (raf) return;
      raf = requestAnimationFrame(() => { update(); raf = null; });
    };
    window.addEventListener('scroll', onScroll, { passive: true });
    window.addEventListener('resize', onScroll, { passive: true });
    update();
    return () => {
      window.removeEventListener('scroll', onScroll);
      window.removeEventListener('resize', onScroll);
    };
  }, []);
  return null;
}

// ── Film grain ────────────────────────────────────────────────────
function Grain() {
  return <div className="grain" aria-hidden />;
}

// ── HUD: REC indicator + frame-counter timecode ──────────────────
function HUD() {
  const [tc, setTc] = useState({ h: 0, m: 42, s: 18, f: 12 });
  useEffect(() => {
    const id = setInterval(() => {
      setTc(prev => {
        let { h, m, s, f } = prev;
        f += 1;
        if (f >= 24) { f = 0; s += 1; }
        if (s >= 60) { s = 0; m += 1; }
        if (m >= 60) { m = 0; h += 1; }
        return { h, m, s, f };
      });
    }, 1000 / 24);
    return () => clearInterval(id);
  }, []);
  const pad = (n) => String(n).padStart(2, '0');
  return (
    <>
      <div className="hud hud-tl">
        <span className="rec">REC</span>
        <span className="sep">·</span>
        <span>24.000 FPS</span>
        <span className="sep">·</span>
        <span>ARRI ALEXA 35</span>
      </div>
      <div className="hud hud-br">
        <span>TC</span>
        <span>{pad(tc.h)}:{pad(tc.m)}:{pad(tc.s)}:{pad(tc.f)}</span>
        <span className="sep">·</span>
        <span>EYEQ / 026</span>
      </div>
    </>
  );
}

// ── Top nav ──────────────────────────────────────────────────────
function Nav({ onStartProject }) {
  const [scrolled, setScrolled] = useState(false);
  const [open, setOpen] = useState(false);
  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 60);
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  useEffect(() => {
    document.body.style.overflow = open ? 'hidden' : '';
    return () => { document.body.style.overflow = ''; };
  }, [open]);

  const links = [
    { href: '#work',      label: 'Work',     idx: '01' },
    { href: '#services',  label: 'Services', idx: '02' },
    { href: '#process',   label: 'Process',  idx: '03' },
    { href: '#studio',    label: 'Studio',   idx: '04' },
    { href: '#press',     label: 'Press',    idx: '05' },
    { href: '#contact',   label: 'Contact',  idx: '06' },
  ];

  return (
    <>
      <nav className={`nav ${scrolled ? 'scrolled' : ''} ${open ? 'menu-open' : ''}`}>
        <a href="#top" className="brand" onClick={() => setOpen(false)}>
          <span className="brand-mark" aria-hidden />
          <span>eye<em style={{ fontStyle: 'italic', color: 'var(--gold)' }}>q</em></span>
        </a>
        <div className="nav-links">
          {links.slice(0, 5).map(l => (
            <a key={l.href} href={l.href}>{l.label}</a>
          ))}
        </div>
        <button className="nav-cta nav-cta-desktop" onClick={onStartProject}>
          <span>Start a Project</span>
          <span className="arr">→</span>
        </button>
        <button
          className={`nav-burger ${open ? 'open' : ''}`}
          aria-label="Menu"
          aria-expanded={open}
          onClick={() => setOpen(o => !o)}
        >
          <span /><span /><span />
        </button>
      </nav>

      <div className={`mobile-drawer ${open ? 'open' : ''}`} aria-hidden={!open}>
        <div className="mobile-drawer-head mono">
          <span>EYEQ · MENU</span>
          <span>{String(links.length).padStart(2, '0')} SECTIONS</span>
        </div>
        <ul className="mobile-drawer-nav">
          {links.map((l, i) => (
            <li key={l.href} style={{ '--i': i }}>
              <a href={l.href} onClick={() => setOpen(false)}>
                <span className="mono mn-idx">/ {l.idx}</span>
                <span className="serif mn-label">{l.label}</span>
                <span className="mn-arr">→</span>
              </a>
            </li>
          ))}
        </ul>
        <div className="mobile-drawer-cta">
          <button className="cta-next" onClick={() => { setOpen(false); onStartProject(); }}>
            Start a Project <span className="arr" />
          </button>
        </div>
        <div className="mobile-drawer-foot mono">
          <div>Mumbai · Delhi · LA</div>
          <div>hello@<em style={{ color: 'var(--gold)', fontStyle: 'italic', fontFamily: 'var(--serif)' }}>eyeq.studio</em></div>
        </div>
      </div>
    </>
  );
}

// ── Scrolling marquee credits ────────────────────────────────────
function Marquee({ items, italic = [] }) {
  // duplicate items for seamless loop
  const all = [...items, ...items];
  return (
    <div className="marquee" aria-hidden>
      <div className="marquee-track">
        {all.map((it, i) => (
          <span key={i} className="marquee-item">
            {italic.includes(i % items.length)
              ? <em>{it}</em>
              : it}
          </span>
        ))}
      </div>
    </div>
  );
}

// ── Aperture / iris between sections ─────────────────────────────
function IrisDivider({ label = 'CUT TO —', meta = 'F/1.4 · OPEN · 24FPS' }) {
  return (
    <section className="iris-section" aria-hidden>
      <div className="iris-meta mono">
        <span>—</span>
        <span>{meta}</span>
        <span>—</span>
      </div>
      <div className="iris-wrap">
        <svg viewBox="0 0 100 100" className="iris-svg">
          {/* outer dial — rotates slowly */}
          <g className="iris-outer">
            <circle cx="50" cy="50" r="46" fill="none" stroke="var(--gold-line)" strokeWidth="0.3" />
            <circle cx="50" cy="50" r="42" fill="none" stroke="var(--gold-line)" strokeWidth="0.3" strokeDasharray="0.5 2" />
            {Array.from({ length: 24 }).map((_, i) => {
              const a = i * 15;
              const major = i % 6 === 0;
              return (
                <line
                  key={i}
                  x1="50" y1={major ? 2 : 4}
                  x2="50" y2={major ? 8 : 6}
                  stroke="var(--gold)"
                  strokeWidth={major ? 0.7 : 0.3}
                  transform={`rotate(${a} 50 50)`}
                />
              );
            })}
          </g>

          {/* aperture blades — pulse open/close */}
          <g className="iris-blades">
            {[0, 60, 120, 180, 240, 300].map(a => (
              <path
                key={a}
                d="M50 14 C 68 30, 64 50, 50 50 C 36 50, 32 30, 50 14 Z"
                fill="rgba(212,184,122,0.07)"
                stroke="var(--gold)"
                strokeWidth="0.45"
                strokeLinejoin="round"
                transform={`rotate(${a} 50 50)`}
              />
            ))}
          </g>

          {/* center reticle */}
          <g>
            <circle cx="50" cy="50" r="1.6" fill="var(--gold)" />
            <line x1="44" y1="50" x2="48" y2="50" stroke="var(--gold)" strokeWidth="0.4" />
            <line x1="52" y1="50" x2="56" y2="50" stroke="var(--gold)" strokeWidth="0.4" />
            <line x1="50" y1="44" x2="50" y2="48" stroke="var(--gold)" strokeWidth="0.4" />
            <line x1="50" y1="52" x2="50" y2="56" stroke="var(--gold)" strokeWidth="0.4" />
          </g>
        </svg>

        {/* corner brackets */}
        <span className="iris-bracket tl" />
        <span className="iris-bracket tr" />
        <span className="iris-bracket bl" />
        <span className="iris-bracket br" />
      </div>
      <div className="iris-label mono">{label}</div>
    </section>
  );
}

Object.assign(window, { Letterbox, Grain, HUD, Nav, Marquee, IrisDivider, CameraZoom });
