/* Wastafy AI app — slim composition: Hero · Problem · WhatWeDo · Proof · Pricing · FAQ · Footer.
   Sticky TopNav across all sections. */

const { useState, useEffect } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "dark",
  "language": "en",
  "timeOverride": "live",
  "weatherOverride": "live"
}/*EDITMODE-END*/;

function App() {
  const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [dubaiTime, setDubaiTime] = useState(() => getDubaiTime());
  const [weather, setWeather] = useState({ condition: "clear", tempC: 32 });

  useEffect(() => {
    const id = setInterval(() => setDubaiTime(getDubaiTime()), 30 * 1000);
    return () => clearInterval(id);
  }, []);

  useEffect(() => {
    const month = getDubaiMonth(dubaiTime);
    const hour = getDubaiHour(dubaiTime);
    const baseTemps = [19, 21, 25, 28, 33, 38, 41, 41, 38, 33, 27, 22];
    const tempC = baseTemps[month] + (hour > 13 && hour < 17 ? 4 : hour > 4 && hour < 7 ? -3 : 0);
    let condition = "clear";
    if ((month === 11 || month === 0 || month === 1) && hour < 9) condition = "fog";
    else if ((month === 0 || month === 1 || month === 2) && Math.random() > 0.85) condition = "rain";
    else if ((month === 2 || month === 3 || month === 4) && Math.random() > 0.9) condition = "sandstorm";
    else if (Math.random() > 0.85) condition = "cloudy";
    setWeather({ condition, tempC });
  }, [getDubaiDate(dubaiTime)]);

  useEffect(() => { document.documentElement.dataset.theme = tweaks.theme; }, [tweaks.theme]);
  useEffect(() => {
    document.documentElement.dataset.lang = tweaks.language;
    document.documentElement.dir = tweaks.language === "ar" ? "rtl" : "ltr";
  }, [tweaks.language]);

  useEffect(() => {
    const els = document.querySelectorAll(".reveal");
    const io = new IntersectionObserver(entries => {
      entries.forEach(e => { if (e.isIntersecting) e.target.classList.add("in"); });
    }, { threshold: 0.12 });
    els.forEach(el => io.observe(el));
    return () => io.disconnect();
  }, [tweaks.language]);

  /* ======================================================================
     SCROLL CHOREOGRAPHY
     - Lenis: inertia smooth scroll with a long, soft easing curve.
       lerp = how quickly we catch up to native scroll position.
       Lower = more inertia. 0.08 feels luxurious, not laggy.
     - Parallax wordmarks: track scroll position and translate the persistent
       background type at fractional speeds (-0.18, -0.32) so the foreground
       slides over a slower-moving graphic plane.
     - Reduced-motion: bail completely. No Lenis, no parallax — native scroll.
     ====================================================================== */
  useEffect(() => {
    if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
      document.documentElement.classList.add("no-motion");
      return;
    }
    if (!window.Lenis) return;

    const lenis = new window.Lenis({
      duration: 0.75,
      easing: (t) => 1 - Math.pow(1 - t, 3), // easeOutCubic — quicker settle
      smoothWheel: true,
      smoothTouch: false, // native touch on mobile
      wheelMultiplier: 1.25,
      touchMultiplier: 2,
    });
    // Expose for skipnav + CTA scroll handlers; native scrollIntoView is
    // intercepted by Lenis, so anchor jumps must go through lenis.scrollTo.
    window.__lenis = lenis;

    const wm1 = document.querySelector(".parallax-word");
    const wm2 = document.querySelector(".parallax-word-2");

    let raf;
    function loop(t) {
      lenis.raf(t);
      const y = lenis.scroll || 0;
      // Slow the giant wordmark to ~18% of scroll (deep background)
      if (wm1) wm1.style.setProperty("--py", `${-y * 0.18}px`);
      // Faster but still sub-1.0 for the secondary italic wordmark (~32%)
      if (wm2) wm2.style.setProperty("--py2", `${-y * 0.32}px`);
      raf = requestAnimationFrame(loop);
    }
    raf = requestAnimationFrame(loop);

    return () => {
      cancelAnimationFrame(raf);
      lenis.destroy();
      if (window.__lenis === lenis) window.__lenis = null;
    };
  }, []);

  const overrideHour = tweaks.timeOverride === "live" ? null : Number(tweaks.timeOverride);
  const overrideWeather = tweaks.weatherOverride === "live" ? null : tweaks.weatherOverride;

  const scrollToCTA = () => {
    const el = document.getElementById("book");
    if (!el) return;
    if (window.__lenis) {
      window.__lenis.scrollTo(el, { offset: 0 });
    } else {
      const top = el.getBoundingClientRect().top + window.scrollY;
      window.scrollTo({ top, behavior: "smooth" });
    }
  };

  return (
    <>
      {/* Persistent oversized wordmarks — slow parallax, fixed behind everything */}
      <div className="parallax-stage" aria-hidden="true">
        <div className="parallax-word">WASTAFY</div>
        <div className="parallax-word-2">your system.</div>
      </div>

      <TopNav
        lang={tweaks.language}
        theme={tweaks.theme}
        onLang={(v) => setTweak("language", v)}
        onTheme={(v) => setTweak("theme", v)}
        onCTA={scrollToCTA}
      />

      <SkipNav lang={tweaks.language} />

      <Hero
        dubaiTime={dubaiTime}
        weather={weather}
        lang={tweaks.language}
        overrideHour={overrideHour}
        overrideWeather={overrideWeather}
        onCTA={scrollToCTA}
      />

      {/* Card-stacked sections — each section floats on the warm page bg */}
      <main className="card-shell">
        <div className="reveal"><Marquee lang={tweaks.language} /></div>
        <div className="card reveal"><Problem lang={tweaks.language} /></div>
        <div className="card reveal"><WhatWeDo lang={tweaks.language} /></div>
        <div className="card reveal"><TryIt lang={tweaks.language} /></div>
        <div className="card reveal"><Proof lang={tweaks.language} /></div>
        <SavingsCalculator isAR={tweaks.language === "ar"} />
        <div className="card reveal"><Pricing lang={tweaks.language} onCTA={scrollToCTA} /></div>
        <div className="card reveal"><Calendar lang={tweaks.language} /></div>
        <div className="card card-flat reveal"><FAQ lang={tweaks.language} /></div>
      </main>
      <Footer lang={tweaks.language} onCTA={scrollToCTA} />

      <TweaksPanel title="Tweaks">
        <TweakSection title="Appearance">
          <TweakRadio
            label="Theme"
            value={tweaks.theme}
            options={[{ value: "light", label: "Light" }, { value: "dark", label: "Dark" }]}
            onChange={v => setTweak("theme", v)}
          />
          <TweakRadio
            label="Language"
            value={tweaks.language}
            options={[{ value: "en", label: "EN" }, { value: "ar", label: "AR" }]}
            onChange={v => setTweak("language", v)}
          />
        </TweakSection>

        <TweakSection title="Skyline">
          <TweakSelect
            label="Time of day"
            value={tweaks.timeOverride}
            options={[
              { value: "live", label: "Live (Dubai now)" },
              { value: "6", label: "Dawn · 06:00" },
              { value: "12", label: "Day · 12:00" },
              { value: "18", label: "Dusk · 18:00" },
              { value: "22", label: "Night · 22:00" },
            ]}
            onChange={v => setTweak("timeOverride", v)}
          />
          <TweakSelect
            label="Weather"
            value={tweaks.weatherOverride}
            options={[
              { value: "live", label: "Live (auto)" },
              { value: "clear", label: "Clear" },
              { value: "cloudy", label: "Cloudy" },
              { value: "rain", label: "Rain" },
              { value: "fog", label: "Fog" },
              { value: "sandstorm", label: "Sandstorm" },
            ]}
            onChange={v => setTweak("weatherOverride", v)}
          />
        </TweakSection>
      </TweaksPanel>
    </>
  );
}

const Marquee = ({ lang }) => {
  const isAR = lang === "ar";
  const items = isAR ? [
    "وكيل صوتي ٢٤/٧", "روبوت نصي يحوّل", "متابعة لا تنام", "+٢٥ لغة", "٣ أيام للتشغيل", "ضمانات الصفقات",
  ] : [
    "24/7 Voice agent", "Text bot that converts", "Follow-up that never sleeps", "25+ languages", "Live in 3 days", "Deal guarantees",
  ];
  const all = [...items, ...items, ...items];
  return (
    <div className="marquee">
      <div className="marquee-track">
        {all.map((it, i) => (
          <span key={i} style={{display:"inline-flex", alignItems:"center", gap:24}}>
            <span style={{color:"var(--accent)"}}>◆</span>{it}
          </span>
        ))}
      </div>
    </div>
  );
};

function getDubaiTime() {
  // Return a normal Date — the consumers format with timeZone: "Asia/Dubai"
  // so we don't want to pre-shift it (which would double-convert).
  return new Date();
}

// Helper: get a numeric Dubai-local hour from any Date
function getDubaiHour(d) {
  const s = d.toLocaleString("en-US", { timeZone: "Asia/Dubai", hour: "2-digit", hour12: false });
  return parseInt(s, 10);
}
function getDubaiMonth(d) {
  const s = d.toLocaleString("en-US", { timeZone: "Asia/Dubai", month: "numeric" });
  return parseInt(s, 10) - 1;
}
function getDubaiDate(d) {
  return d.toLocaleDateString("en-CA", { timeZone: "Asia/Dubai" });
}

window.getDubaiHour = getDubaiHour;
window.getDubaiMonth = getDubaiMonth;
window.getDubaiDate = getDubaiDate;

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