/* global React, ReactDOM, Header, Hero, Values, CategoryTiles, Editorial, Featured, Catalog, Product, Cart, Footer, useTweaks, TweaksPanel, TweakSection, TweakRadio, TweakColor, TweakText, TweakSelect */
const { useState, useEffect, useRef } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "brandName": "Comptoir Indigo",
  "tagline": "TEXTILES D'ART · DEPUIS LE RAJASTHAN",
  "headingFont": "Playfair Display",
  "bodyFont": "Manrope",
  "paper": "#ffffff",
  "ink": "#1a1a1a",
  "accent": "#cc4535",
  "announce": "Livraison offerte en France dès 150 € · Made in Jaipur with ♥"
}/*EDITMODE-END*/;

function Announce({ text }) {
  return <div className="announce">{text}</div>;
}

function urlToRoute(pathname) {
  const parts = pathname.split("/").filter(Boolean);
  if (!parts.length) return { page: "home" };
  if (parts[0] === "catalogue") return { page: "catalog", category: parts[1] || "all" };
  if (parts[0] === "produit" && parts[1]) return { page: "product", id: parts[1] };
  return { page: "home" };
}
function routeToUrl(route) {
  if (route.page === "home") return "/";
  if (route.page === "catalog") return route.category === "all" ? "/catalogue" : `/catalogue/${route.category}`;
  if (route.page === "product") return `/produit/${route.id}`;
  return "/";
}

function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [route, setRoute] = useState(() => urlToRoute(window.location.pathname));
  const [cart, setCart] = useState([]);
  const [cartOpen, setCartOpen] = useState(false);

  // Sync browser history ↔ route
  useEffect(() => {
    const onPop = () => setRoute(urlToRoute(window.location.pathname));
    window.addEventListener("popstate", onPop);
    return () => window.removeEventListener("popstate", onPop);
  }, []);

  // Apply CSS vars from tweaks
  useEffect(() => {
    const root = document.documentElement;
    root.style.setProperty("--paper", t.paper);
    root.style.setProperty("--ink", t.ink);
    root.style.setProperty("--indigo", t.accent);
    root.style.setProperty("--serif", `'${t.headingFont}', Georgia, serif`);
    root.style.setProperty("--sans", `'${t.bodyFont}', 'Helvetica Neue', sans-serif`);
  }, [t]);

  // Load Google Fonts dynamically based on tweak
  useEffect(() => {
    const fonts = [t.headingFont, t.bodyFont].map((f) => f.replace(/ /g, "+") + ":wght@300;400;500;600;700");
    const id = "tw-fonts";
    const existing = document.getElementById(id);
    if (existing) existing.remove();
    const link = document.createElement("link");
    link.id = id;
    link.rel = "stylesheet";
    link.href = `https://fonts.googleapis.com/css2?family=${fonts.join("&family=")}&display=swap`;
    document.head.appendChild(link);
  }, [t.headingFont, t.bodyFont]);

  // Navigate + update URL + scroll to top
  const navigate = (next) => {
    const url = routeToUrl(next);
    window.history.pushState(null, "", url);
    setRoute(next);
    window.scrollTo({ top: 0, behavior: "instant" });
  };

  const addToCart = (item) => {
    setCart((prev) => {
      const ex = prev.find((p) => p.id === item.id);
      if (ex) return prev.map((p) => p.id === item.id ? { ...p, qty: p.qty + item.qty } : p);
      return [...prev, item];
    });
    setCartOpen(true);
  };
  const setQty = (id, qty) => setCart((prev) => prev.map((p) => p.id === id ? { ...p, qty } : p));
  const removeItem = (id) => setCart((prev) => prev.filter((p) => p.id !== id));

  const cartCount = cart.reduce((sum, it) => sum + it.qty, 0);
  const brand = { name: t.brandName, tagline: t.tagline };

  return (
    <>
      <Announce text={t.announce} />
      <Header route={route} navigate={navigate} cartCount={cartCount} openCart={() => setCartOpen(true)} brand={brand} />

      {route.page === "home" && (
        <main>
          <CategoryTiles navigate={navigate} />
          <Hero navigate={navigate} brand={brand} />
          <Values />
          <Editorial brand={brand} />
        </main>
      )}

      {route.page === "catalog" && (
        <main><Catalog route={route} navigate={navigate} /></main>
      )}

      {route.page === "product" && (
        <main><Product route={route} navigate={navigate} addToCart={addToCart} /></main>
      )}

      <Footer navigate={navigate} brand={brand} />

      <Cart open={cartOpen} close={() => setCartOpen(false)} items={cart} setQty={setQty} removeItem={removeItem} navigate={navigate} />

      {/* Floating WhatsApp */}
      <a href="https://wa.me/33660501257" target="_blank" rel="noopener" className="wa-float" title="Nous écrire sur WhatsApp">
        <span className="wa-icon">
          <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
            <path d="M12 2C6.477 2 2 6.477 2 12c0 1.89.525 3.66 1.438 5.168L2 22l4.978-1.418A9.956 9.956 0 0012 22c5.523 0 10-4.477 10-10S17.523 2 12 2z" fill="#25D366"/>
            <path d="M17.004 14.57c-.275-.138-1.628-.803-1.88-.895-.25-.09-.433-.137-.615.138-.183.274-.707.895-.867 1.079-.16.183-.32.206-.594.069-.275-.138-1.16-.427-2.21-1.362-.817-.728-1.369-1.627-1.529-1.902-.16-.274-.017-.423.12-.56.124-.123.275-.32.412-.48.138-.16.183-.275.275-.458.091-.183.046-.343-.023-.48-.069-.138-.615-1.484-.843-2.033-.222-.534-.448-.46-.615-.469l-.524-.009c-.183 0-.48.069-.731.343-.252.275-.96.938-.96 2.285 0 1.348.983 2.65 1.12 2.833.137.183 1.934 2.95 4.687 4.136.655.283 1.166.452 1.565.578.658.209 1.257.18 1.73.11.527-.079 1.628-.666 1.857-1.309.228-.643.228-1.194.16-1.309-.069-.114-.251-.183-.526-.32z" fill="white"/>
          </svg>
        </span>
        <span className="wa-text">WhatsApp</span>
      </a>

      <TweaksPanel title="Tweaks">
        <TweakSection label="Identité" />
        <TweakText label="Nom de la marque" value={t.brandName} onChange={(v) => setTweak("brandName", v)} />
        <TweakText label="Sous-titre" value={t.tagline} onChange={(v) => setTweak("tagline", v)} />
        <TweakText label="Bandeau annonce" value={t.announce} onChange={(v) => setTweak("announce", v)} />
        <TweakSection label="Typographie" />
        <TweakSelect label="Police titres" value={t.headingFont} onChange={(v) => setTweak("headingFont", v)} options={[
          "Cormorant Garamond", "Italiana", "Tenor Sans", "Playfair Display", "DM Serif Display", "Marcellus", "Bodoni Moda"
        ]} />
        <TweakSelect label="Police courante" value={t.bodyFont} onChange={(v) => setTweak("bodyFont", v)} options={[
          "Outfit", "Manrope", "Work Sans", "DM Sans", "Lato", "Nunito Sans"
        ]} />
        <TweakSection label="Couleurs" />
        <TweakColor label="Fond" value={t.paper} onChange={(v) => setTweak("paper", v)} options={["#faf6f0", "#f4ede0", "#f6f3ec", "#ffffff", "#ede4d0"]} />
        <TweakColor label="Encre" value={t.ink} onChange={(v) => setTweak("ink", v)} options={["#1a1a1a", "#0e0e0e", "#2a2a2a", "#3d2820"]} />
        <TweakColor label="Accent" value={t.accent} onChange={(v) => setTweak("accent", v)} options={["#1f3a52", "#b85c3f", "#1f6878", "#5b7a4a", "#c98a2a", "#86304f"]} />
      </TweaksPanel>
    </>
  );
}

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