// app.jsx — RojoNorte landing page

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

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "heroVariant": "centered",
  "bgTone": "paper"
}/*EDITMODE-END*/;

// Map bgTone → data-theme attribute on <html>
const TONE_TO_THEME = {
  paper: "light",
  charcoal: "dark",
  black: "black",
};

function useFadeIn() {
  const ref = useRef(null);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const io = new IntersectionObserver(
      (entries) => entries.forEach((e) => e.isIntersecting && e.target.classList.add("in")),
      { rootMargin: "0px 0px -10% 0px", threshold: 0.05 }
    );
    io.observe(el);
    return () => io.disconnect();
  }, []);
  return ref;
}

function FadeUp({ children, delay = 0, as: Tag = "div", className = "", style = {}, ...rest }) {
  const ref = useFadeIn();
  return (
    <Tag
      ref={ref}
      className={`fade-up ${className}`}
      style={{ transitionDelay: `${delay}ms`, ...style }}
      {...rest}
    >
      {children}
    </Tag>
  );
}

function Nav({ t, lang, setLang, theme, setTheme }) {
  const [menuOpen, setMenuOpen] = useState(false);

  const cycleTheme = () => {
    const order = ["paper", "charcoal", "black"];
    const next = order[(order.indexOf(theme) + 1) % order.length];
    setTheme(next);
  };
  const themeIcon =
    theme === "paper" ? "◐" : theme === "charcoal" ? "◑" : "●";

  useEffect(() => {
    document.body.style.overflow = menuOpen ? "hidden" : "";
    return () => { document.body.style.overflow = ""; };
  }, [menuOpen]);

  const closeMenu = () => setMenuOpen(false);

  const navLinks = [
    { href: "#services", label: t.nav.services },
    { href: "#why",      label: t.nav.why },
    { href: "#process",  label: t.nav.process },
    { href: "#team",     label: t.nav.team },
    { href: "#cases",    label: t.nav.cases },
    { href: "#contact",  label: t.nav.contact },
  ];

  return (
    <nav className="nav">
      <div className="wrap nav-inner">
        <a href="#top" className="brand">
          <BrandMark size={26} animate={true} />
          <span>Rojo <em>Norte</em></span>
        </a>
        <div className="nav-links">
          {navLinks.map(({ href, label }) => (
            <a key={href} href={href}>{label}</a>
          ))}
        </div>
        <div className="nav-right">
          <div className="tog" role="group" aria-label="Language">
            <button className={lang === "en" ? "on" : ""} onClick={() => setLang("en")}>EN</button>
            <button className={lang === "es" ? "on" : ""} onClick={() => setLang("es")}>ES</button>
          </div>
          <button
            className="theme-tog"
            onClick={cycleTheme}
            aria-label={`Theme: ${theme}`}
            title={`Theme: ${theme}`}
          >
            <span style={{ fontSize: 14, lineHeight: 1 }}>{themeIcon}</span>
          </button>
          <a href="#contact" className="btn btn-red nav-cta" style={{ padding: "10px 18px", fontSize: 13 }}>
            {t.nav.cta} <span className="arrow">→</span>
          </a>
          <button
            className="menu-tog"
            onClick={() => setMenuOpen((o) => !o)}
            aria-label={menuOpen ? "Close menu" : "Open menu"}
            aria-expanded={menuOpen}
          >
            {menuOpen ? "✕" : "☰"}
          </button>
        </div>
      </div>
      {menuOpen && (
        <div className="nav-drawer" role="dialog" aria-label="Navigation">
          {navLinks.map(({ href, label }) => (
            <a key={href} href={href} onClick={closeMenu}>{label}</a>
          ))}
          <a href="#contact" className="btn btn-red" onClick={closeMenu}>
            {t.nav.cta} <span className="arrow">→</span>
          </a>
        </div>
      )}
    </nav>
  );
}

function HeroCentered({ t }) {
  return (
    <section className="hero hero-v1" id="top">
      <div className="hero-rose"><CompassRose /></div>
      <div className="wrap hero-inner">
        <FadeUp className="hero-kicker"><span className="dot"></span>{t.hero.kicker}</FadeUp>
        <FadeUp as="h1" className="headline" delay={100}>
          {t.hero.title_a} <em>{t.hero.title_em}</em>
        </FadeUp>
        <FadeUp as="p" className="hero-sub" delay={200}>{t.hero.sub}</FadeUp>
        <FadeUp className="hero-cta" delay={300}>
          <a href="#contact" className="btn btn-red">
            {t.hero.cta_primary} <span className="arrow">→</span>
          </a>
          <a href="#cases" className="btn btn-ghost">{t.hero.cta_secondary}</a>
        </FadeUp>
      </div>
      <div className="wrap" style={{ marginTop: "clamp(64px, 9vw, 120px)" }}>
        <FadeUp className="coord-strip" delay={400}>
          {t.hero.coords.map((c, i) => <span key={i}>{c}</span>)}
        </FadeUp>
      </div>
    </section>
  );
}

function HeroAsymmetric({ t }) {
  return (
    <section className="hero hero-v2" id="top">
      <div className="wrap hero-inner">
        <div className="hero-text">
          <FadeUp className="hero-kicker"><span className="dot"></span>{t.hero.kicker}</FadeUp>
          <FadeUp as="h1" className="headline" delay={100}>
            {t.hero.title_a} <em>{t.hero.title_em}</em>
          </FadeUp>
          <FadeUp as="p" className="hero-sub" delay={200}>{t.hero.sub}</FadeUp>
          <FadeUp className="hero-cta" delay={300}>
            <a href="#contact" className="btn btn-red">
              {t.hero.cta_primary} <span className="arrow">→</span>
            </a>
            <a href="#cases" className="btn btn-ghost">{t.hero.cta_secondary}</a>
          </FadeUp>
        </div>
        <FadeUp className="compass-stage" delay={150}>
          <CompassDial />
        </FadeUp>
      </div>
      <div className="wrap" style={{ marginTop: "clamp(56px, 8vw, 100px)" }}>
        <FadeUp className="coord-strip" delay={400}>
          {t.hero.coords.map((c, i) => <span key={i}>{c}</span>)}
        </FadeUp>
      </div>
    </section>
  );
}

function Services({ t }) {
  return (
    <section className="section services" id="services">
      <div className="wrap">
        <div className="section-head">
          <FadeUp className="eyebrow"><b>{t.services.eyebrow}</b></FadeUp>
          <div>
            <FadeUp as="h2" className="section-title">
              {t.services.title_a} <em>{t.services.title_em}</em>
            </FadeUp>
            <FadeUp as="p" className="section-lede" delay={100}>{t.services.lede}</FadeUp>
          </div>
        </div>
        <div>
          {t.services.items.map((svc, i) => (
            <FadeUp key={i} className="service" delay={i * 60}>
              <div className="svc-num">/{String(i + 1).padStart(2, "0")}</div>
              <div className="svc-body">
                <h3 className="svc-name">{svc.name}</h3>
                <p>{svc.desc}</p>
              </div>
              <div className="svc-tags">
                {svc.tags.map((tag, j) => <span key={j} className="svc-tag">{tag}</span>)}
              </div>
              <span className="svc-arrow">→</span>
            </FadeUp>
          ))}
        </div>
      </div>
    </section>
  );
}

function Why({ t }) {
  return (
    <section className="section why" id="why">
      <div className="wrap">
        <div className="section-head">
          <FadeUp className="eyebrow"><b>{t.why.eyebrow}</b></FadeUp>
          <div>
            <FadeUp as="h2" className="section-title">
              {t.why.title_a} <em>{t.why.title_em}</em>
            </FadeUp>
            <FadeUp as="p" className="section-lede" delay={100}>{t.why.lede}</FadeUp>
          </div>
        </div>

        <div className="why-grid">
          <FadeUp>
            <div className="stats">
              {t.why.stats.map((s, i) => (
                <div key={i} className="stat">
                  <div className="stat-num">{s.num}<em>{s.num_em}</em></div>
                  <div className="stat-lbl">{s.lbl}</div>
                  <div className="stat-desc">{s.desc}</div>
                </div>
              ))}
            </div>
          </FadeUp>

          <FadeUp delay={150}>
            <div className="map-card">
              <div className="map-meta">
                <span><b>{t.why.map.title}</b></span>
                <span>{t.why.map.sub}</span>
              </div>
              <NearshoreMap />
              <div className="map-legend">
                <span className="lg origin"><span className="swatch"></span>{t.why.map.legend_origin}</span>
                <span className="lg"><span className="swatch"></span>{t.why.map.legend_dest}</span>
              </div>
            </div>
          </FadeUp>
        </div>
      </div>
    </section>
  );
}

function Process({ t }) {
  return (
    <section className="section" id="process">
      <div className="wrap">
        <div className="section-head">
          <FadeUp className="eyebrow"><b>{t.process.eyebrow}</b></FadeUp>
          <div>
            <FadeUp as="h2" className="section-title">
              {t.process.title_a} <em>{t.process.title_em}</em>
            </FadeUp>
          </div>
        </div>
        <FadeUp>
          <div className="process-grid">
            {t.process.steps.map((s, i) => (
              <div key={i} className="step">
                <div className="step-num">
                  /<em>{String(i + 1).padStart(2, "0")}</em>
                </div>
                <div>
                  <h3 className="step-title">{s.title}</h3>
                  <p className="step-desc">{s.desc}</p>
                </div>
                <div className="step-foot">{s.foot}</div>
              </div>
            ))}
          </div>
        </FadeUp>
      </div>
    </section>
  );
}

function Team({ t }) {
  return (
    <section className="section" id="team">
      <div className="wrap">
        <div className="section-head">
          <FadeUp className="eyebrow"><b>{t.team.eyebrow}</b></FadeUp>
          <div>
            <FadeUp as="h2" className="section-title">
              {t.team.title_a} <em>{t.team.title_em}</em>
            </FadeUp>
            <FadeUp as="p" className="section-lede" delay={100}>{t.team.lede}</FadeUp>
          </div>
        </div>
        <div className="team-grid">
          {t.team.members.map((m, i) => (
            <FadeUp key={i} className="member" delay={i * 80}>
              <div className="portrait">
                <div className="portrait-meta">
                  <span>portrait</span>
                  <em>/{String(i + 1).padStart(2, "0")}</em>
                </div>
              </div>
              <div>
                <h3 className="member-name">{m.name}</h3>
                <div className="member-role">{m.role} · {m.years}</div>
                <p className="member-bg">{m.bg}</p>
              </div>
            </FadeUp>
          ))}
        </div>

        <FadeUp className="hiring" delay={200}>
          <div className="hiring-text">
            <div className="hiring-kicker"><span className="blink"></span>{t.team.hiring.kicker}</div>
            <h3 className="hiring-title">{t.team.hiring.title}</h3>
          </div>
          <a href="#contact" className="btn btn-ghost">
            {t.team.hiring.cta} <span className="arrow">→</span>
          </a>
        </FadeUp>
      </div>
    </section>
  );
}

function Cases({ t }) {
  const placeholders = [
    "Truck dispatcher console",
    "Treasury dashboard",
    "Plant floor SCADA",
  ];
  return (
    <section className="section" id="cases">
      <div className="wrap">
        <div className="section-head">
          <FadeUp className="eyebrow"><b>{t.cases.eyebrow}</b></FadeUp>
          <div>
            <FadeUp as="h2" className="section-title">
              {t.cases.title_a} <em>{t.cases.title_em}</em>
            </FadeUp>
            <FadeUp as="p" className="section-lede" delay={100}>{t.cases.lede}</FadeUp>
          </div>
        </div>
        <div className="cases-grid">
          {t.cases.items.map((c, i) => (
            <FadeUp key={i} className="case" delay={i * 100}>
              <div className="case-img">
                <span>placeholder · {placeholders[i]}</span>
              </div>
              <div className="case-meta">
                <span><b>{c.tag}</b></span>
                <span>{c.year}</span>
              </div>
              <h3 className="case-name">{c.name}</h3>
              <p className="case-desc">{c.desc}</p>
              <div className="case-foot">
                <span>Outcome</span>
                <em>{c.outcome}</em>
              </div>
            </FadeUp>
          ))}
        </div>
      </div>
    </section>
  );
}

function CTA({ t }) {
  return (
    <section className="cta-section" id="contact">
      <div className="cta-rose"><CompassRose withN={true} /></div>
      <div className="wrap cta-inner">
        <FadeUp className="hero-kicker"><span className="dot"></span>{t.cta.kicker}</FadeUp>
        <FadeUp as="h2" className="headline" delay={100}>
          {t.cta.title_a} <em>{t.cta.title_em}</em>
        </FadeUp>
        <FadeUp as="p" className="hero-sub" delay={200}>{t.cta.sub}</FadeUp>
        <FadeUp className="cta-form" delay={300}>
          <input type="email" placeholder={t.cta.placeholder} aria-label="email" />
          <button className="btn btn-red">{t.cta.btn} <span className="arrow">→</span></button>
        </FadeUp>
      </div>
    </section>
  );
}

function Footer({ t }) {
  return (
    <footer className="footer">
      <div className="wrap">
        <div className="footer-grid">
          <div className="footer-brand">
            <a className="brand" href="#top" style={{ marginBottom: 0 }}>
              <BrandMark size={26} animate={false} />
              <span>Rojo <em>Norte</em></span>
            </a>
            <p>{t.footer.tag}</p>
          </div>
          <div>
            <h5>{t.footer.contact_h}</h5>
            <ul>
              {t.footer.contact.map((c, i) => (
                <li key={i} style={{ whiteSpace: "pre-line" }}>{c}</li>
              ))}
            </ul>
          </div>
          <div>
            <h5>{t.footer.links_h}</h5>
            <ul>
              {t.footer.links.map((c, i) => <li key={i}><a href="#">{c}</a></li>)}
            </ul>
          </div>
          <div>
            <h5>{t.footer.legal_h}</h5>
            <ul>
              {t.footer.legal.map((c, i) => <li key={i}><a href="#">{c}</a></li>)}
            </ul>
          </div>
        </div>
        <div className="footer-bot">
          <span>{t.footer.copy}</span>
          <span>{t.footer.coords}</span>
        </div>
      </div>
    </footer>
  );
}

function App() {
  const [tweak, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [lang, setLang] = useState("en");

  const theme = tweak.bgTone || "paper";

  useEffect(() => {
    document.documentElement.setAttribute("data-theme", TONE_TO_THEME[theme] || "light");
  }, [theme]);

  const t = window.RN_CONTENT[lang];

  return (
    <React.Fragment>
      <Nav
        t={t}
        lang={lang}
        setLang={setLang}
        theme={theme}
        setTheme={(v) => setTweak("bgTone", v)}
      />
      {tweak.heroVariant === "asymmetric" ? <HeroAsymmetric t={t} /> : <HeroCentered t={t} />}
      <Services t={t} />
      <Why t={t} />
      <Process t={t} />
      <Team t={t} />
      <Cases t={t} />
      <CTA t={t} />
      <Footer t={t} />

      <TweaksPanel title="Tweaks">
        <TweakSection label="Hero" />
        <TweakRadio
          label="Variant"
          value={tweak.heroVariant}
          options={[
            { value: "centered", label: "Centered" },
            { value: "asymmetric", label: "Asymmetric" },
          ]}
          onChange={(v) => setTweak("heroVariant", v)}
        />
        <TweakSection label="Background tone" />
        <TweakRadio
          label="Tone"
          value={tweak.bgTone}
          options={[
            { value: "paper", label: "Paper" },
            { value: "charcoal", label: "Charcoal" },
            { value: "black", label: "Black" },
          ]}
          onChange={(v) => setTweak("bgTone", v)}
        />
      </TweaksPanel>
    </React.Fragment>
  );
}

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
