/* roastynote — shared app root for inner pages.
   Renders the page named by <body data-page="...">. */
const { useState, useEffect } = React;

const PAGE_TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "paperTone": "cream",
  "darkTone": "ink",
  "accent": "ember",
  "wordmark": "split",
  "displayScale": 1
}/*EDITMODE-END*/;

const PAGE_PAPER = { cream: "#F4EFE6", shell: "#EBE4D6", bone: "#DED6C6" };
const PAGE_DARK  = { ink: "#14110D", espresso: "#221913", roast: "#2E1C10" };
const PAGE_ACCENT = { ember: "#952C16", ochre: "#9C7A33", clay: "#B96A45" };

function usePageReveal() {
  useEffect(() => {
    const check = () => {
      const vh = window.innerHeight;
      document.querySelectorAll("[data-reveal]:not(.in)").forEach((el) => {
        const r = el.getBoundingClientRect();
        if (r.top < vh * 0.9 && r.bottom > 0) el.classList.add("in");
      });
    };
    check();
    const t1 = setTimeout(check, 80);
    const t2 = setTimeout(check, 400);
    window.addEventListener("scroll", check, { passive: true });
    window.addEventListener("resize", check, { passive: true });
    return () => {
      clearTimeout(t1); clearTimeout(t2);
      window.removeEventListener("scroll", check);
      window.removeEventListener("resize", check);
    };
  }, []);
}

const PAGE_MAP = {
  studio:  (lang) => <StudioPage lang={lang} />,
  work:    (lang) => <WorkPage lang={lang} />,
  journal: (lang) => <JournalPage lang={lang} />,
  contact: (lang) => <ContactPage lang={lang} />,
  portier: (lang) => <PortierPage lang={lang} />,
  cultivia:(lang) => <CultiviaPage lang={lang} />,
  "indonesian-beans":(lang) => <IndonesianBeansPage lang={lang} />,
  lattecarte:(lang) => <LattecartePage lang={lang} />,
  context:(lang) => <ContextPage lang={lang} />,
  "salt-light":(lang) => <SaltLightPage lang={lang} />,
};

function PageApp() {
  const [t, setTweak] = useTweaks(PAGE_TWEAK_DEFAULTS);
  const [lang, setLangState] = useState(() => {
    try { return localStorage.getItem("rn-lang") || "en"; } catch (e) { return "en"; }
  });
  const setLang = (v) => {
    setLangState(v);
    try { localStorage.setItem("rn-lang", v); } catch (e) {}
  };
  const [scrolled, setScrolled] = useState(false);
  const [menuOpen, setMenuOpen] = useState(false);
  const page = document.body.dataset.page || "studio";

  useEffect(() => {
    const r = document.documentElement.style;
    r.setProperty("--rn-paper", PAGE_PAPER[t.paperTone] || PAGE_PAPER.cream);
    r.setProperty("--rn-dark", PAGE_DARK[t.darkTone] || PAGE_DARK.ink);
    r.setProperty("--rn-accent", PAGE_ACCENT[t.accent] || PAGE_ACCENT.ember);
    r.setProperty("--rn-display-scale", String(t.displayScale ?? 1));
  }, [t.paperTone, t.darkTone, t.accent, t.displayScale]);

  useEffect(() => {
    document.body.setAttribute("data-wordmark", t.wordmark || "split");
  }, [t.wordmark]);

  useEffect(() => {
    document.documentElement.lang = lang === "jp" ? "ja" : "en";
    document.body.classList.toggle("jp", lang === "jp");
  }, [lang]);

  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 48);
    onScroll();
    window.addEventListener("scroll", onScroll, { passive: true });
    return () => window.removeEventListener("scroll", onScroll);
  }, []);

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

  usePageReveal();

  return (
    <React.Fragment>
      <Nav lang={lang} setLang={setLang} scrolled={scrolled} onOpenMenu={() => setMenuOpen(true)} />
      <MobileMenu lang={lang} setLang={setLang} open={menuOpen} onClose={() => setMenuOpen(false)} />
      {PAGE_MAP[page](lang)}
      <Footer lang={lang} />
      <TweaksPanel title="Tweaks">
        <TweakSection label="Palette" />
        <TweakColor label="Paper" value={PAGE_PAPER[t.paperTone]}
          options={[PAGE_PAPER.cream, PAGE_PAPER.shell, PAGE_PAPER.bone]}
          onChange={(v) => setTweak("paperTone", pageKeyOf(PAGE_PAPER, v))} />
        <TweakColor label="Dark sections" value={PAGE_DARK[t.darkTone]}
          options={[PAGE_DARK.ink, PAGE_DARK.espresso, PAGE_DARK.roast]}
          onChange={(v) => setTweak("darkTone", pageKeyOf(PAGE_DARK, v))} />
        <TweakColor label="Accent" value={PAGE_ACCENT[t.accent]}
          options={[PAGE_ACCENT.ember, PAGE_ACCENT.ochre, PAGE_ACCENT.clay]}
          onChange={(v) => setTweak("accent", pageKeyOf(PAGE_ACCENT, v))} />
      </TweaksPanel>
    </React.Fragment>
  );
}

function pageKeyOf(map, val) {
  return Object.keys(map).find(k => map[k] === val) || Object.keys(map)[0];
}

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