/* global React, ReactDOM, I18nProvider, useI18n, Nav, Footer, HomePage, PortfolioPage, ContactPage, Chatbot, TweaksPanel, useTweaks, TweakRadio, TweakToggle, TweakColor */
// Dentertain — main App

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "accent": "blush",
  "chatbot": true,
  "lang": "de"
}/*EDITMODE-END*/;

const App = () => {
  // Route
  const [route, setRoute] = React.useState(() => {
    const h = (typeof window !== "undefined" && window.location.hash) || "";
    const id = h.replace(/^#\/?/, "");
    if (["portfolio", "contact", "bewerten", "impressum", "datenschutz", "agb", "widerruf"].includes(id)) return id;
    return "home";
  });

  // Tweaks (array destructure: [values, setter])
  const [tweak, setTweak] = useTweaks(TWEAK_DEFAULTS);

  // Apply accent attribute on <html>
  React.useEffect(() => {
    document.documentElement.setAttribute("data-accent", tweak.accent || "blush");
  }, [tweak.accent]);

  // Persist route in hash
  React.useEffect(() => {
    if (typeof window === "undefined") return;
    window.location.hash = "#/" + route;
    window.scrollTo({ top: 0, behavior: "instant" });
  }, [route]);

  // Listen for hashchange (back button)
  React.useEffect(() => {
    const onHash = () => {
      const id = (window.location.hash || "").replace(/^#\/?/, "");
      if (["home", "portfolio", "contact", "bewerten", "impressum", "datenschutz", "agb", "widerruf"].includes(id)) {
        setRoute(id);
      } else if (!id) {
        setRoute("home");
      }
    };
    window.addEventListener("hashchange", onHash);
    return () => window.removeEventListener("hashchange", onHash);
  }, []);

  const onNavigate = (id) => setRoute(id);

  return (
    <I18nProvider initial={tweak.lang || "de"}>
      <Nav route={route} onNavigate={onNavigate} />
      <main key={route} className="page-enter">
        {route === "home"      && <HomePage      onNavigate={onNavigate} />}
        {route === "portfolio" && <PortfolioPage onNavigate={onNavigate} />}
        {route === "contact"   && <ContactPage   onNavigate={onNavigate} />}
        {route === "bewerten"  && <BewertenPage  onNavigate={onNavigate} />}
        {["impressum", "datenschutz", "agb", "widerruf"].includes(route) && <LegalPage page={route} onNavigate={onNavigate} />}
      </main>
      <Footer onNavigate={onNavigate} />
      <Chatbot enabled={!!tweak.chatbot} onNavigate={onNavigate} />

      <TweaksPanel title="Tweaks">
        <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <TweakRadio
            label="Akzentfarbe"
            value={tweak.accent}
            onChange={(v) => setTweak("accent", v)}
            options={[
              { value: "blush", label: "Blush" },
              { value: "sage",  label: "Sage" },
              { value: "peach", label: "Peach" },
              { value: "ink",   label: "Mono" },
            ]}
          />
          <TweakToggle
            label="Chatbot anzeigen"
            value={tweak.chatbot}
            onChange={(v) => setTweak("chatbot", v)}
          />
        </div>
      </TweaksPanel>
    </I18nProvider>
  );
};

const mountApp = () => {
  const el = document.getElementById("root");
  if (!el) return;
  const root = ReactDOM.createRoot(el);
  root.render(<App />);
};

if (document.readyState === "loading") {
  window.addEventListener("DOMContentLoaded", mountApp);
} else {
  mountApp();
}
