// app.jsx — Nav + App shell. Hero is now in hero-section.jsx
const { useState, useEffect, useRef } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "dark",
  "accent": "#60A5FA",
  "displayFont": "General Sans",
  "heroImage": "hero-truck-corridor"
}/*EDITMODE-END*/;

// ── Echo Logo SVG ─────────────────────────────────────────────────
// Teal dot + three concentric arcs sweeping right. Tight 24×28 viewBox
// (no trailing whitespace) so the wordmark sits closer to the symbol.
// Radii arithmetic 5 → 8 → 11; chord length always equals 2r so each
// arc is a clean semicircle, giving an even radio-wave silhouette.
function LogoMark({ size = 26, light = false }) {
  // Brand mark — uses the canonical Echo logo image asset.
  // The asset is the dark-bg version; on light backgrounds we keep it as-is
  // because the logo container reads cleanly on both via subtle border-radius
  // and the inherent dark canvas of the logo.
  return (
    <img
      src="img/echo-logo.jpeg"
      alt="Echo"
      width={size}
      height={size}
      style={{ display: 'block', borderRadius: 4, objectFit: 'contain' }}
    />
  );
}

// ── Solutions dropdown ────────────────────────────────────────────
function SolutionsDropdown({ onPhoto }) {
  const [open, setOpen] = useState(false);
  const ref = useRef(null);

  useEffect(() => {
    const close = e => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener('mousedown', close);
    return () => document.removeEventListener('mousedown', close);
  }, []);

  const items = [
    { label: 'Oracle ERP',             sub: 'Fusion · NetSuite · JD Edwards', href: '/erp' },
    { label: 'Freight & Logistics',    sub: 'Carriers · Brokers · 3PLs',       href: '/freight' },
    { label: 'Regenerative Health',    sub: 'SUD · Behavioral · Clinics',      href: '/health' },
  ];

  const linkColor = onPhoto ? 'rgba(244,240,232,0.72)' : 'var(--muted)';
  const linkHover = onPhoto ? '#F4F0E8' : 'var(--ink)';

  return (
    <div ref={ref} style={{ position: 'relative' }}>
      <button
        onClick={() => setOpen(o => !o)}
        style={{
          background: 'none', border: 'none', cursor: 'pointer', padding: 0,
          fontFamily: 'var(--ff-mono)', fontSize: 11, letterSpacing: '0.1em',
          color: open ? linkHover : linkColor,
          textTransform: 'uppercase', transition: 'color 0.2s',
          fontWeight: 500, display: 'flex', alignItems: 'center', gap: 5,
        }}
        onMouseEnter={e => e.currentTarget.style.color = linkHover}
        onMouseLeave={e => { if (!open) e.currentTarget.style.color = linkColor; }}
      >
        Solutions
        <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" style={{ transform: open ? 'rotate(180deg)' : 'none', transition: 'transform 0.2s' }}><path d="M6 9l6 6 6-6"/></svg>
      </button>
      {open && (
        <div style={{
          position: 'absolute', top: 'calc(100% + 14px)', left: '50%', transform: 'translateX(-50%)',
          background: 'var(--bg)', border: '1px solid var(--hairline)', borderRadius: 12,
          padding: '8px', minWidth: 240,
          boxShadow: '0 20px 60px rgba(0,0,0,0.22)', zIndex: 200,
        }}>
          {items.map(item => (
            <a key={item.href} href={item.href} onClick={() => setOpen(false)} style={{
              display: 'flex', flexDirection: 'column', gap: 2,
              padding: '11px 14px', borderRadius: 8,
              textDecoration: 'none', color: 'inherit',
              transition: 'background 0.15s',
            }}
              onMouseEnter={e => e.currentTarget.style.background = 'var(--surface)'}
              onMouseLeave={e => e.currentTarget.style.background = 'transparent'}
            >
              <span style={{ fontFamily: 'var(--ff-mono)', fontSize: 11, fontWeight: 600, color: 'var(--ink)', letterSpacing: '0.04em' }}>{item.label}</span>
              <span style={{ fontSize: 11, color: 'var(--muted)' }}>{item.sub}</span>
            </a>
          ))}
        </div>
      )}
    </div>
  );
}

// ── Nav ───────────────────────────────────────────────────────────
function Nav({ theme, setTheme, scrolled }) {
  const links = [
    { label: 'Agents',       href: '#agents' },
    { label: 'Why Echo',     href: '#why-echo' },
    { label: 'How It Works', href: '#how-it-works' },
  ];

  // Top of page (over photo) — light text. After scroll — paper bg.
  const onPhoto = !scrolled;

  return (
    <nav style={{
      position: 'fixed', top: 0, left: 0, right: 0, zIndex: 100,
      background: scrolled
        ? (theme === 'dark' ? '#0A1612' : '#F4F0E8')
        : 'transparent',
      borderBottom: scrolled ? '1px solid var(--hairline)' : '1px solid transparent',
      transition: 'all 0.4s cubic-bezier(0.16,1,0.3,1)',
    }}>
      <div className="nav-inner" style={{ maxWidth: 1280, margin: '0 auto', padding: '0 48px', height: 68, display: 'flex', alignItems: 'center', gap: 40 }}>
        {/* Logo */}
        <a href="#" style={{ display: 'flex', alignItems: 'center', gap: 8, flexShrink: 0 }}>
          <LogoMark size={26} light={onPhoto} />
          <span style={{
            fontFamily: 'var(--ff-display)',
            fontSize: 19, fontWeight: 500, letterSpacing: '-0.01em',
            color: onPhoto ? '#F4F0E8' : 'var(--ink)',
            transition: 'color 0.4s',
          }}>Echo</span>
        </a>

        {/* Links */}
        <div className="nav-links" style={{ flex: 1, display: 'flex', gap: 32, alignItems: 'center' }}>
          <SolutionsDropdown onPhoto={onPhoto} />
          {links.map(l => (
            <a key={l.label} href={l.href} style={{
              fontFamily: 'var(--ff-mono)', fontSize: 11, letterSpacing: '0.1em',
              color: onPhoto ? 'rgba(244,240,232,0.72)' : 'var(--muted)',
              textTransform: 'uppercase', transition: 'color 0.2s',
              fontWeight: 500,
            }}
              onMouseEnter={e => e.target.style.color = onPhoto ? '#F4F0E8' : 'var(--ink)'}
              onMouseLeave={e => e.target.style.color = onPhoto ? 'rgba(244,240,232,0.72)' : 'var(--muted)'}
            >{l.label}</a>
          ))}
        </div>

        {/* Right */}
        <div className="nav-right" style={{ display: 'flex', alignItems: 'center', gap: 14 }}>
          <button onClick={() => setTheme(t => t === 'light' ? 'dark' : 'light')}
            style={{
              background: 'none', border: 'none', cursor: 'pointer',
              color: onPhoto ? 'rgba(244,240,232,0.72)' : 'var(--muted)',
              padding: 7, borderRadius: 7, display: 'flex',
              transition: 'color 0.2s, background 0.2s',
            }}
            onMouseEnter={e => {
              e.currentTarget.style.color = onPhoto ? '#F4F0E8' : 'var(--ink)';
              e.currentTarget.style.background = onPhoto ? 'rgba(244,240,232,0.08)' : 'var(--surface)';
            }}
            onMouseLeave={e => {
              e.currentTarget.style.color = onPhoto ? 'rgba(244,240,232,0.72)' : 'var(--muted)';
              e.currentTarget.style.background = 'transparent';
            }}
          >
            {theme === 'light'
              ? <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
              : <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
            }
          </button>
          <a href="#book" data-open-book-call className="echo-cta echo-cta--primary echo-cta--nav">
            <span className="echo-cta__dot" />
            <span className="echo-cta__label">Get a demo</span>
            <svg className="echo-cta__arrow" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
          </a>
        </div>
      </div>
    </nav>
  );
}

// ── Tweaks ────────────────────────────────────────────────────────
function EchoTweaks({ tweaks, setTweak }) {
  return (
    <TweaksPanel>
      <TweakSection label="Theme">
        <TweakRadio id="theme" label="Mode" value={tweaks.theme} options={['light', 'dark']} onChange={v => setTweak('theme', v)} />
      </TweakSection>
      <TweakSection label="Accent Color">
        <TweakColor id="accent" label="Accent" value={tweaks.accent} onChange={v => setTweak('accent', v)} />
      </TweakSection>
      <TweakSection label="Hero Image">
        <TweakSelect id="heroImage" label="Photo" value={tweaks.heroImage}
          options={[
            { label: 'Container yard (default)', value: 'hero-truck-corridor' },
            { label: 'Port at dawn',              value: 'mood-port-lights' },
            { label: 'Truck on mountain road',    value: 'truck-distance' },
            { label: 'Truck on highway',          value: 'truck-on-highway' },
            { label: 'Aerial: container grid',    value: 'highway-aerial-1' },
            { label: 'Aerial: distribution',      value: 'fleet-row' },
          ]}
          onChange={v => setTweak('heroImage', v)}
        />
      </TweakSection>
      <TweakSection label="Display Font">
        <TweakSelect id="displayFont" label="Font" value={tweaks.displayFont}
          options={[
            { label: 'General Sans (default)', value: 'General Sans' },
            { label: 'Geist', value: 'Geist' },
            { label: 'Aeonik', value: 'Aeonik' },
          ]}
          onChange={v => setTweak('displayFont', v)}
        />
      </TweakSection>
    </TweaksPanel>
  );
}

// ── App ───────────────────────────────────────────────────────────
function App() {
  const [tweaks, setTweakState] = useState(TWEAK_DEFAULTS);
  const [scrolled, setScrolled] = useState(false);
  const [tweaksOpen, setTweaksOpen] = useState(false);

  const setTweak = (key, val) => {
    setTweakState(prev => {
      const next = typeof key === 'object' ? { ...prev, ...key } : { ...prev, [key]: val };
      window.parent.postMessage({ type: '__edit_mode_set_keys', edits: next }, '*');
      return next;
    });
  };

  useEffect(() => { document.documentElement.setAttribute('data-theme', tweaks.theme); }, [tweaks.theme]);

  useEffect(() => {
    document.documentElement.style.setProperty('--accent', tweaks.accent);
    document.documentElement.style.setProperty('--accent-dim', tweaks.accent + '1a');
    document.documentElement.style.setProperty('--accent-glow', tweaks.accent + '38');
  }, [tweaks.accent]);

  useEffect(() => {
    document.documentElement.style.setProperty('--ff-display', `'${tweaks.displayFont}', 'Geist', system-ui, sans-serif`);
  }, [tweaks.displayFont]);

  useEffect(() => {
    let ticking = false;
    const onScroll = () => {
      if (ticking) return;
      ticking = true;
      requestAnimationFrame(() => { setScrolled(window.scrollY > 80); ticking = false; });
    };
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);

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

  useEffect(() => {
    const obs = new IntersectionObserver(entries => {
      entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('visible'); obs.unobserve(e.target); } });
    }, { threshold: 0.07 });
    document.querySelectorAll('.reveal').forEach(el => obs.observe(el));

    // Tag plates with .in-view as they enter the viewport (drives both the
    // accent halo on dark mode plates AND the scroll-fade-up reveal).
    // Set-once: stays revealed after first crossing the threshold.
    const plateObs = new IntersectionObserver(entries => {
      entries.forEach(e => {
        if (e.isIntersecting) {
          e.target.classList.add('in-view');
          plateObs.unobserve(e.target);
        }
      });
    }, { threshold: 0.12, rootMargin: '0px 0px -8% 0px' });
    document.querySelectorAll('.glass-plate').forEach(el => plateObs.observe(el));

    // (Hero video parallax removed — was causing scroll lag due to
    // continuous transform on a 23MB video element. The fixed video
    // background already creates depth without scroll-coupled motion.)

    return () => { obs.disconnect(); plateObs.disconnect(); };
  }, []);

  return (
    <>
      <Nav theme={tweaks.theme} setTheme={fn => setTweak('theme', fn(tweaks.theme))} scrolled={scrolled} />
      <main>
        <Hero heroImage={tweaks.heroImage} />
        <Problem />
        <AgentsAndDemo />
        <WhyEcho />
        <Comparison />
        <HowItWorks />
      </main>
      <Footer theme={tweaks.theme} setTheme={fn => setTweak('theme', fn(tweaks.theme))} />
      <DemoModal />
      <BookCallModal />
      {tweaksOpen && <EchoTweaks tweaks={tweaks} setTweak={setTweak} />}
    </>
  );
}

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