/* Morph menu — single nav for all viewports.
   The rotating Beigman logo (top-right corner) acts as the trigger; clicking
   it morphs a frosted-glass navy panel out from the logo's corner. Click the
   logo again, click outside the panel, or press Esc to reverse the animation.

   Replaces the old SideNav (desktop) + MobileNav fullscreen overlay. The
   trigger button markup is identical to before — the existing logo video is
   untouched. Only the overlay was redesigned. */

const NAV_ITEMS = [
  { id: "holistic-approach", label: "Holistic Approach" },
  { id: "projects",      label: "Projects" },
  { id: "performance",   label: "Performance Solutions" },
  { id: "process",       label: "Roadmap" },
  { id: "services",      label: "Services" },
  { id: "contact",       label: "Contact" },
];

function useScrolled(offset = 40) {
  const [y, setY] = React.useState(0);
  React.useEffect(() => {
    const onScroll = () => setY(window.scrollY);
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return y > offset;
}

/* Scroll-direction listener: visible at the very top or while scrolling up,
   hidden while scrolling down. rAF-throttled, small dead-zone to avoid jitter. */
function useScrollDirection() {
  const [show, setShow] = React.useState(true);
  React.useEffect(() => {
    let last = window.scrollY;
    let raf = 0;
    const update = () => {
      const y = window.scrollY;
      if (y < 12)               setShow(true);
      else if (y > last + 4)    setShow(false);
      else if (y < last - 4)    setShow(true);
      last = y;
      raf = 0;
    };
    const onScroll = () => { if (!raf) raf = requestAnimationFrame(update); };
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => { window.removeEventListener('scroll', onScroll); if (raf) cancelAnimationFrame(raf); };
  }, []);
  return show;
}

/* Glassmorphic floating island — centered pill at the top, desktop only.
   Hides on scroll-down, reappears on scroll-up. Coexists with the morph
   logo trigger (top-right) which still owns the full overlay menu. */
function HeaderNav() {
  const show = useScrollDirection();
  return (
    <header
      className="header-island fixed top-5 left-1/2 z-40 hidden md:block"
      style={{
        transform: `translateX(-50%) translateY(${show ? '0' : '-160%'})`,
        opacity: show ? 1 : 0,
        pointerEvents: show ? 'auto' : 'none',
      }}
    >
      <nav
        aria-label="Primary"
        className="flex items-center gap-7 rounded-full border border-white/10 bg-midnight/30 px-7 py-3 backdrop-blur-md shadow-[0_18px_48px_rgba(0,0,0,0.28)]"
        style={{ maxWidth: 700 }}
      >
        {NAV_ITEMS.map((item) => (
          <a
            key={item.id}
            href={`#${item.id}`}
            className="header-nav-link font-heading text-sm font-normal tracking-wide whitespace-nowrap"
          >
            {item.label}
          </a>
        ))}
      </nav>
    </header>
  );
}

/* Persistent conversion CTA — hidden while inside the hero, fades in once
   the user scrolls past it. Inner anchor reuses .m3-fill-btn for the premium
   organic copper fill + lift on hover (origin follows the cursor via motion.js). */
function FloatingCTA() {
  const [visible, setVisible] = React.useState(false);
  React.useEffect(() => {
    let raf = 0;
    const update = () => { setVisible(window.scrollY >= window.innerHeight * 0.92); raf = 0; };
    const onScroll = () => { if (!raf) raf = requestAnimationFrame(update); };
    update();
    window.addEventListener('scroll', onScroll, { passive: true });
    window.addEventListener('resize', update);
    return () => {
      window.removeEventListener('scroll', onScroll);
      window.removeEventListener('resize', update);
      if (raf) cancelAnimationFrame(raf);
    };
  }, []);

  return (
    <div
      className="floating-cta fixed bottom-6 right-6 z-40"
      style={{
        opacity: visible ? 1 : 0,
        transform: visible ? 'translateY(0)' : 'translateY(18px)',
        pointerEvents: visible ? 'auto' : 'none',
      }}
    >
      <a
        href="#contact"
        aria-label="Get in touch"
        className="m3-fill-btn inline-flex items-center gap-2.5 rounded-full bg-copper px-6 py-3.5
                   font-heading text-[11px] font-semibold tracking-[0.22em] text-off-white
                   shadow-[0_16px_40px_-12px_rgba(178,124,77,0.7)]"
        style={{ '--fill': '#8E5F38' }}
      >
        GET IN TOUCH
        <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.4" aria-hidden="true">
          <path d="M2.5 7 H11.5 M7.5 3 L11.5 7 L7.5 11" strokeLinecap="round" strokeLinejoin="round" />
        </svg>
      </a>
    </div>
  );
}

/* SideNav kept as a no-op so any stray reference still resolves. */
function SideNav() { return null; }

function MobileNav() {
  const [open, setOpen] = React.useState(false);

  // Esc closes
  React.useEffect(() => {
    if (!open) return;
    const onKey = (e) => { if (e.key === 'Escape') setOpen(false); };
    window.addEventListener('keydown', onKey);
    return () => window.removeEventListener('keydown', onKey);
  }, [open]);

  const close = () => setOpen(false);

  return (
    <>
      {/* Rotating logo trigger — UNCHANGED visually, now toggles. */}
      <button
        aria-label={open ? "Close menu" : "Open menu"}
        aria-expanded={open}
        onClick={() => setOpen((o) => !o)}
        className="fixed top-0 right-0 z-50 grid h-[66px] w-[66px] md:h-[74px] md:w-[74px] place-items-center overflow-hidden rounded-bl-[34px] md:rounded-bl-[40px] rounded-tl-none rounded-br-none rounded-tr-none border-0 bg-black shadow-[0_18px_48px_rgba(0,0,0,0.38)]"
      >
        <span className="sr-only">Menu</span>
        <video
          className="h-[39px] w-[39px] md:h-[44px] md:w-[44px] object-contain translate-x-1 -translate-y-1"
          src="assets/Beigman rotate Logo.mp4"
          autoPlay muted loop playsInline preload="metadata"
          aria-hidden="true"
        />
      </button>

      {/* Click-outside catcher — transparent, sits below panel + above page.
         Mounted only when open so it never blocks page interaction otherwise. */}
      {open && (
        <div
          onClick={close}
          className="fixed inset-0 z-30"
          aria-hidden="true"
        />
      )}

      {/* Morph panel — anchored top-right, scales out from logo corner. */}
      <div
        role="dialog"
        aria-modal="true"
        aria-label="Site navigation"
        aria-hidden={!open}
        className={`morph-menu fixed top-0 right-0 z-40 origin-top-right
                    w-[min(420px,calc(100vw-20px))]
                    ${open ? '' : 'pointer-events-none'}`}
        style={{
          opacity: open ? 1 : 0,
          transform: open
            ? 'scale(1) translateY(0)'
            : 'scale(0.78) translateY(-10px)',
          transition: open
            ? 'opacity 380ms cubic-bezier(0.05,0.7,0.1,1), transform 650ms cubic-bezier(0.05,0.7,0.1,1)'
            : 'opacity 280ms cubic-bezier(0.3,0,0.8,0.15), transform 380ms cubic-bezier(0.3,0,0.8,0.15)',
        }}
      >
        <div className="morph-menu-card mt-[78px] md:mt-[86px] mr-3 md:mr-4 overflow-hidden">
          {/* MENU eyebrow */}
          <div className="px-7 pt-6 pb-2">
            <div className="font-heading text-[10px] tracking-[0.34em] text-copper/85">
              MENU
            </div>
          </div>
          <div className="h-px mx-7 mb-2 bg-gradient-to-r from-copper/55 via-copper/15 to-transparent" />

          {/* Items */}
          <nav className="px-3 py-3" aria-label="Primary">
            {NAV_ITEMS.map((item, i) => (
              <a
                key={item.id}
                href={`#${item.id}`}
                onClick={close}
                className="morph-menu-item group flex items-center gap-4 px-4 py-3 rounded-[10px]"
                style={{
                  opacity: open ? 1 : 0,
                  transform: open ? 'translateY(0)' : 'translateY(6px)',
                  transition: open
                    ? `opacity 420ms ${120 + i * 50}ms cubic-bezier(0.05,0.7,0.1,1), transform 520ms ${120 + i * 50}ms cubic-bezier(0.05,0.7,0.1,1)`
                    : 'opacity 180ms, transform 220ms',
                }}
              >
                <span className="morph-menu-num font-heading text-[10px] tracking-[0.28em] w-7 text-copper/45 transition-colors duration-300">
                  0{i + 1}
                </span>
                <span className="morph-menu-label flex-1 font-heading text-[17px] md:text-[18px] tracking-[0.005em] text-off-white transition-colors duration-300">
                  {item.label}
                </span>
                <svg
                  className="morph-menu-arrow text-copper opacity-0 -translate-x-2 transition-all duration-400"
                  width="14" height="14" viewBox="0 0 14 14"
                  fill="none" stroke="currentColor" strokeWidth="1.4"
                  aria-hidden="true"
                >
                  <path d="M2.5 7 H11.5 M7.5 3 L11.5 7 L7.5 11" strokeLinecap="round" strokeLinejoin="round" />
                </svg>
              </a>
            ))}
          </nav>

          {/* CTA — GET IN TOUCH */}
          <div className="px-5 pt-2 pb-6"
               style={{
                 opacity: open ? 1 : 0,
                 transform: open ? 'translateY(0)' : 'translateY(6px)',
                 transition: open
                   ? 'opacity 420ms 470ms cubic-bezier(0.05,0.7,0.1,1), transform 520ms 470ms cubic-bezier(0.05,0.7,0.1,1)'
                   : 'opacity 180ms, transform 220ms',
               }}>
            <a
              href="#contact"
              onClick={close}
              className="morph-menu-cta group relative flex items-center justify-center gap-3 py-3.5 px-5
                         font-heading text-[11px] tracking-[0.3em] text-copper
                         border border-copper/55 rounded-[10px]
                         overflow-hidden transition-colors duration-400"
            >
              <span className="relative z-10 transition-colors duration-400 group-hover:text-off-white">
                GET IN TOUCH
              </span>
              <svg
                className="relative z-10 text-copper transition-all duration-400
                           group-hover:text-off-white group-hover:translate-x-1"
                width="14" height="14" viewBox="0 0 14 14"
                fill="none" stroke="currentColor" strokeWidth="1.4"
                aria-hidden="true"
              >
                <path d="M2.5 7 H11.5 M7.5 3 L11.5 7 L7.5 11" strokeLinecap="round" strokeLinejoin="round" />
              </svg>
              {/* copper wash fills from left on hover */}
              <span className="morph-menu-cta-fill absolute inset-0 bg-copper origin-left scale-x-0 group-hover:scale-x-100 transition-transform duration-500 ease-[cubic-bezier(0.05,0.7,0.1,1)]" />
            </a>
          </div>
        </div>
      </div>
    </>
  );
}

Object.assign(window, { SideNav, MobileNav, HeaderNav, FloatingCTA, NAV_ITEMS });
