// app.jsx — Entry point. Routing, top bar, persistence, tweaks panel.

const { useState: useState_, useEffect: useEffect_, useMemo: useMemo_ } = React;
const STATIONS = window.STATIONS;

// ─── Routing helpers (hash-based) ───────────────────────────────────────────
function readRoute() {
  const h = (window.location.hash || "").replace(/^#\/?/, "");
  return h || "home";
}
function writeRoute(r) {
  window.location.hash = "#/" + r;
}

// ─── Persistence ────────────────────────────────────────────────────────────
const LS_DONE = "tbr.completed";
const LS_NAME = "tbr.kidName";

// ─── Top bar ────────────────────────────────────────────────────────────────
function TopBar({ route, setRoute, completed, total }) {
  const ratio = completed.size / total;
  const inStation = route.startsWith("station/");
  return (
    <header style={{
      position: "sticky", top: 0, zIndex: 20,
      backdropFilter: "blur(12px) saturate(140%)",
      WebkitBackdropFilter: "blur(12px) saturate(140%)",
      background: "rgba(243,232,204,0.78)",
      borderBottom: "1px solid var(--rule)",
    }}>
      <div style={{
        maxWidth: 760, margin: "0 auto", padding: "10px 16px",
        display: "flex", alignItems: "center", gap: 12,
      }}>
        <button onClick={() => setRoute("home")}
          style={{
            appearance: "none", border: 0, background: "transparent",
            cursor: "pointer", padding: 0, display: "flex", alignItems: "center", gap: 8,
            font: "inherit",
          }}>
          <Logo size={28} />
          <span className="h-display" style={{ fontSize: 18, lineHeight: 1 }}>
            Bike Rodeo
          </span>
        </button>
        <div style={{ flex: 1 }} />

        {/* Progress meter */}
        <div title={`${completed.size} of ${total} stations done`}
             style={{ display: "flex", alignItems: "center", gap: 8 }}>
          <div style={{
            width: 60, height: 6, borderRadius: 999,
            background: "rgba(29,26,20,0.12)", overflow: "hidden",
          }}>
            <div style={{
              width: `${ratio * 100}%`, height: "100%",
              background: "var(--accent)", transition: "width 240ms ease",
            }} />
          </div>
          <span style={{
            fontSize: 12, fontFamily: "var(--f-body)", fontWeight: 600,
            color: "var(--ink-mute)", minWidth: 24, textAlign: "right",
          }}>
            {completed.size}/{total}
          </span>
        </div>
      </div>
    </header>
  );
}

function Logo({ size = 28 }) {
  return (
    <svg width={size} height={size} viewBox="0 0 32 32" aria-hidden="true">
      <circle cx="9" cy="22" r="6" fill="none" stroke="var(--ink)" strokeWidth="2" />
      <circle cx="23" cy="22" r="6" fill="none" stroke="var(--ink)" strokeWidth="2" />
      <path d="M 9 22 L 16 12 L 21 12 M 16 12 L 23 22 M 13 8 L 17 8"
            stroke="var(--accent)" strokeWidth="2.2" fill="none" strokeLinecap="round" strokeLinejoin="round" />
      <circle cx="16" cy="12" r="1.5" fill="var(--accent)" />
    </svg>
  );
}

// ─── App ────────────────────────────────────────────────────────────────────
function App() {
  const [t, setTweak] = useTweaks(window.TWEAK_DEFAULTS);
  const [route, _setRoute] = useState_(readRoute());
  const [completedArr, setCompletedArr] = useState_(() => readLS(LS_DONE, []));
  const [kidName, setKidName] = useState_(() => readLS(LS_NAME, ""));

  const completed = useMemo_(() => new Set(completedArr), [completedArr]);

  // Apply tweaks → CSS variables
  useEffect_(() => {
    const r = document.documentElement;
    r.style.setProperty("--accent", t.accent || "#b8412b");

    // Density
    if (t.density === "compact") {
      r.style.setProperty("--pad", "14px");
      r.style.setProperty("--gap", "12px");
    } else if (t.density === "comfy") {
      r.style.setProperty("--pad", "22px");
      r.style.setProperty("--gap", "20px");
    } else {
      r.style.setProperty("--pad", "18px");
      r.style.setProperty("--gap", "16px");
    }

    // Font pair
    if (t.fontPair === "domine-caveat") {
      r.style.setProperty("--f-display", '"Domine", Georgia, serif');
    } else if (t.fontPair === "playfair-caveat") {
      r.style.setProperty("--f-display", '"Playfair Display", Georgia, serif');
    } else {
      r.style.setProperty("--f-display", '"Newsreader", Georgia, serif');
    }
  }, [t]);

  // Lazy-load extra Google Fonts if user picks them
  useEffect_(() => {
    if (t.fontPair === "domine-caveat" || t.fontPair === "playfair-caveat") {
      const id = "tbr-extra-fonts";
      if (!document.getElementById(id)) {
        const l = document.createElement("link");
        l.id = id; l.rel = "stylesheet";
        l.href = "https://fonts.googleapis.com/css2?family=Domine:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,600;0,700;0,800;1,400;1,700&display=swap";
        document.head.appendChild(l);
      }
    }
  }, [t.fontPair]);

  // Hash sync
  useEffect_(() => {
    const onHash = () => _setRoute(readRoute());
    window.addEventListener("hashchange", onHash);
    return () => window.removeEventListener("hashchange", onHash);
  }, []);
  function setRoute(r) {
    _setRoute(r); writeRoute(r);
  }

  // Persist completion
  useEffect_(() => { writeLS(LS_DONE, completedArr); }, [completedArr]);
  useEffect_(() => { writeLS(LS_NAME, kidName); }, [kidName]);

  function toggleComplete(id) {
    setCompletedArr(arr => arr.includes(id) ? arr.filter(x => x !== id) : [...arr, id]);
  }

  // Resolve route
  let body;
  if (route.startsWith("station/")) {
    const id = route.slice("station/".length);
    const station = STATIONS.find(s => s.id === id);
    body = station
      ? <StationView stations={STATIONS} station={station} completed={completed}
                     toggleComplete={toggleComplete} setRoute={setRoute} />
      : <NotFound setRoute={setRoute} />;
  } else if (route === "certificate") {
    body = <CertificateView stations={STATIONS} completed={completed}
                            setRoute={setRoute} kidName={kidName} setKidName={setKidName} />;
  } else if (route === "before") {
    body = <BeforeView setRoute={setRoute} />;
  } else if (route === "map") {
    body = <MapView stations={STATIONS} completed={completed} setRoute={setRoute} />;
  } else if (route === "after") {
    body = <AfterView setRoute={setRoute} />;
  } else if (route === "faq") {
    body = <FaqView setRoute={setRoute} />;
  } else if (route === "register") {
    body = <RegisterView setRoute={setRoute} />;
  } else {
    body = <Home stations={STATIONS} completed={completed} setRoute={setRoute} />;
  }

  return (
    <>
      <TopBar route={route} setRoute={setRoute} completed={completed} total={STATIONS.length} />
      <main>{body}</main>

      <TweaksPanel>
        <TweakSection label="Theme" />
        <TweakColor label="Accent" value={t.accent}
          options={["#b8412b", "#2c4870", "#5a7a3a", "#7a3a8a", "#1d1a14"]}
          onChange={(v) => setTweak("accent", v)} />

        <TweakSection label="Typography" />
        <TweakRadio label="Display font" value={t.fontPair}
          options={[
            { value: "newsreader-caveat", label: "Newsreader" },
            { value: "domine-caveat", label: "Domine" },
            { value: "playfair-caveat", label: "Playfair" },
          ]}
          onChange={(v) => setTweak("fontPair", v)} />

        <TweakSection label="Layout" />
        <TweakRadio label="Density" value={t.density}
          options={["compact", "regular", "comfy"]}
          onChange={(v) => setTweak("density", v)} />

        <TweakSection label="Progress" />
        <TweakButton label="Reset progress"
          onClick={() => { setCompletedArr([]); setKidName(""); }} />
      </TweaksPanel>
    </>
  );
}

function NotFound({ setRoute }) {
  return (
    <div style={{ padding: 40, textAlign: "center" }}>
      <h2 className="h-display" style={{ fontSize: 32 }}>Hmm — not found</h2>
      <button className="btn btn-ghost" onClick={() => setRoute("home")}>back home</button>
    </div>
  );
}

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