// 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 }) {
  const stroke = light ? '#F4F0E8' : 'var(--ink)';
  const w = size * (24 / 28);
  return (
    <svg width={w} height={size} viewBox="0 0 24 28" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
      <circle cx="5" cy="14" r="3.2" fill="#60A5FA"/>
      <path d="M10 9 A 5 5 0 0 1 10 19"   stroke={stroke} strokeOpacity="0.96" strokeWidth="2.2" strokeLinecap="round" fill="none"/>
      <path d="M14 6 A 8 8 0 0 1 14 22"   stroke={stroke} strokeOpacity="0.55" strokeWidth="2.2" strokeLinecap="round" fill="none"/>
      <path d="M18 3 A 11 11 0 0 1 18 25" stroke={stroke} strokeOpacity="0.28" strokeWidth="2.2" strokeLinecap="round" fill="none"/>
    </svg>
  );
}

// ── 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' ? 'rgba(10,22,18,0.92)' : 'rgba(244,240,232,0.92)')
        : 'transparent',
      backdropFilter: scrolled ? 'blur(20px) saturate(180%)' : 'none',
      WebkitBackdropFilter: scrolled ? 'blur(20px) saturate(180%)' : 'none',
      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 }}>
          {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="#" 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(() => {
    const onScroll = () => setScrolled(window.scrollY > 80);
    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 — gentle scale + translate as the page scrolls
    const video = document.querySelector('.site-video-bg video');
    let ticking = false;
    const onScroll = () => {
      if (!video || ticking) return;
      ticking = true;
      requestAnimationFrame(() => {
        const y = Math.min(window.scrollY, 800);
        video.style.transform = `translateY(${y * 0.18}px) scale(${1 + y * 0.00015})`;
        ticking = false;
      });
    };
    window.addEventListener('scroll', onScroll, { passive: true });

    return () => { obs.disconnect(); plateObs.disconnect(); window.removeEventListener('scroll', onScroll); };
  }, []);

  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))} />
      {tweaksOpen && <EchoTweaks tweaks={tweaks} setTweak={setTweak} />}
    </>
  );
}

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