// =====================================================================
// SOMOS SETAS — Storefront components
// =====================================================================

const { useState, useEffect, useMemo, useRef, useCallback } = React;

// ---------- Utilities ----------
const fmtPrice = (n) => "$ " + Math.round(n).toLocaleString("es-AR");
const slug = (s) => s.toString().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");

// ---------- Video URL parser ----------
// Devuelve { type: "youtube"|"vimeo"|"direct", embed, url } o null
function parseVideoUrl(raw) {
  if (!raw || !raw.trim()) return null;
  const url = raw.trim();
  const yt = url.match(/(?:youtube\.com\/(?:watch\?v=|shorts\/)|youtu\.be\/)([a-zA-Z0-9_-]{11})/);
  if (yt) {
    const id = yt[1];
    return { type: "youtube", embed: `https://www.youtube.com/embed/${id}?autoplay=1&mute=1&loop=1&playlist=${id}&controls=0&playsinline=1` };
  }
  const vm = url.match(/vimeo\.com\/(\d+)/);
  if (vm) {
    return { type: "vimeo", embed: `https://player.vimeo.com/video/${vm[1]}?autoplay=1&muted=1&loop=1&background=1` };
  }
  if (/\.(mp4|webm|ogg)(\?|$)/i.test(url)) {
    return { type: "direct", url };
  }
  return null;
}

// ---------- Pricing tiers ----------
// T_MINORISTA: subtotal >= $150k \u2192 env\u00edo gratis a sucursal, sin descuento
// T_MAYORISTA: total pagado >= $250k con \u221230% \u2192 subtotal >= $250k / 0.70 \u2248 $357.143
// T_DISTRIBUIDOR: total pagado >= $500k con \u221245% \u2192 subtotal >= $500k / 0.55 \u2248 $909.091
const T_MINORISTA    = 150000;
const T_MAYORISTA    = Math.ceil(250000 / 0.70); // 357143 \u2192 paga $250k con \u221230%
const T_DISTRIBUIDOR = Math.ceil(500000 / 0.55); // 909091 \u2192 paga $500k con \u221245%

function getPricingTier(subtotal) {
  if (subtotal >= T_DISTRIBUIDOR) {
    return { id: "distribuidor", name: "Distribuidor", discount: 0.45, freeShipping: true, freeToBranch: true, next: null };
  }
  if (subtotal >= T_MAYORISTA) {
    return { id: "mayorista", name: "Mayorista", discount: 0.30, freeShipping: false, freeToBranch: true,
      next: { name: "Distribuidor", threshold: T_DISTRIBUIDOR, label: "precio Distribuidor \u221245% + env\u00edo gratis \ud83c\udfc6" } };
  }
  if (subtotal >= T_MINORISTA) {
    return { id: "minorista", name: null, discount: 0, freeShipping: false, freeToBranch: true,
      next: { name: "Mayorista", threshold: T_MAYORISTA, label: "precio Mayorista \u221230% \ud83c\udf89" } };
  }
  return { id: null, name: null, discount: 0, freeShipping: false, freeToBranch: false,
    next: { name: "Env\u00edo gratis a sucursal", threshold: T_MINORISTA, label: "env\u00edo gratis a sucursal \ud83d\ude9a" } };
}

// ---------- Inline SVG icons (minimal line set) ----------
const Icon = {
  search: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg>,
  user:   (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 4-7 8-7s8 3 8 7"/></svg>,
  bag:    (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M5 7h14l-1 13H6L5 7z"/><path d="M9 7V5a3 3 0 0 1 6 0v2"/></svg>,
  close:  (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M6 6l12 12M18 6 6 18"/></svg>,
  arrow:  (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M5 12h14M13 6l6 6-6 6"/></svg>,
  arrowL: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M19 12H5M11 6l-6 6 6 6"/></svg>,
  whatsapp: (p) => <svg viewBox="0 0 24 24" fill="currentColor" {...p}><path d="M17.5 14.4c-.3-.1-1.7-.8-1.9-.9-.3-.1-.4-.1-.6.1-.2.3-.7.9-.8 1.1-.1.2-.3.2-.6.1-.3-.1-1.2-.4-2.3-1.4-.8-.7-1.4-1.6-1.6-1.9-.2-.3 0-.4.1-.6.1-.1.3-.3.4-.5.1-.2.2-.3.3-.5 0-.2 0-.4-.1-.5-.1-.1-.6-1.5-.9-2.1-.2-.5-.4-.5-.6-.5h-.5c-.2 0-.5.1-.7.3-.2.3-1 .9-1 2.3 0 1.4 1 2.7 1.1 2.9.1.2 2 3.1 4.8 4.3.7.3 1.2.5 1.6.6.7.2 1.3.2 1.8.1.6-.1 1.7-.7 2-1.4.2-.7.2-1.2.2-1.4-.1-.1-.3-.2-.5-.3M12 2C6.5 2 2 6.5 2 12c0 1.8.5 3.5 1.3 4.9L2 22l5.2-1.4c1.4.7 3 1.2 4.8 1.2 5.5 0 10-4.5 10-10 0-2.7-1-5.1-2.9-7C17 3 14.6 2 12 2"/></svg>,
  plus:   (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M12 5v14M5 12h14"/></svg>,
  edit:   (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M14 5l5 5L8 21H3v-5L14 5z"/></svg>,
  trash:  (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13"/></svg>,
  insta:  (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><rect x="3" y="3" width="18" height="18" rx="5"/><circle cx="12" cy="12" r="4"/><circle cx="17.5" cy="6.5" r="0.8" fill="currentColor"/></svg>,
  pin:    (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M12 21s7-7 7-12a7 7 0 1 0-14 0c0 5 7 12 7 12z"/><circle cx="12" cy="9" r="2.5"/></svg>,
  phone:    (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M5 4h4l2 5-3 2c1 2 3 4 5 5l2-3 5 2v4c0 1-1 2-2 2C9 21 3 15 3 6c0-1 1-2 2-2"/></svg>,
  download: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><path d="M12 3v13M7 11l5 5 5-5"/><path d="M5 21h14"/></svg>,
  info:     (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}><circle cx="12" cy="12" r="9"/><path d="M12 11v5M12 8h.01"/></svg>,
};

// ---------- Hooks ----------
function useLocalState(key, initial) {
  const [val, setVal] = useState(() => {
    try {
      const raw = localStorage.getItem(key);
      return raw ? JSON.parse(raw) : initial;
    } catch { return initial; }
  });
  useEffect(() => {
    try { localStorage.setItem(key, JSON.stringify(val)); } catch {}
  }, [key, val]);
  return [val, setVal];
}

function useHashRoute() {
  const [hash, setHash] = useState(window.location.hash || "#");
  useEffect(() => {
    const fn = () => setHash(window.location.hash || "#");
    window.addEventListener("hashchange", fn);
    return () => window.removeEventListener("hashchange", fn);
  }, []);
  const parts = hash.replace(/^#\/?/, "").split("/").filter(Boolean);
  return { hash, parts, raw: hash };
}

const navigate = (h) => { window.location.hash = h; };

// ---------- App-wide stores ----------
function useStore() {
  const [products,       setProductsState]       = useState(window.SS_PRODUCTS);
  const [banners,        setBannersState]        = useState(window.SS_DEFAULT_BANNERS);
  const [config,         setConfigState]         = useState(window.SS_DEFAULT_CONFIG);
  const [orders,         setOrdersState]         = useState([]);
  const [discountCodes,  setDiscountCodesState]  = useState([]);
  const [dbLoading, setDbLoading]    = useState(true);
  const [auth, setAuth]              = useState(false);

  // Cart se mantiene en localStorage (es por dispositivo)
  const [cart, setCart] = useLocalState("ss_cart_v1", []);

  // Auth: derivada de la sesión de Supabase (no localStorage)
  useEffect(() => {
    window.sb.auth.getSession().then(({ data: { session } }) => setAuth(!!session));
    const { data: { subscription } } = window.sb.auth.onAuthStateChange((_e, session) => setAuth(!!session));
    return () => subscription.unsubscribe();
  }, []);

  // Carga inicial desde Supabase + auto-seed si la DB está vacía
  useEffect(() => {
    Promise.all([
      window.sb.from("ss_store").select("*").eq("id", 1).maybeSingle(),
      window.sb.from("ss_orders").select("*").order("ts", { ascending: false }),
    ]).then(([{ data }, { data: ordersRows, error: ordErr }]) => {
        if (data) {
          const prods  = data.products?.length ? data.products : window.SS_PRODUCTS;
          const bans   = data.banners?.length  ? data.banners  : window.SS_DEFAULT_BANNERS;
          const cfg    = data.config && Object.keys(data.config).length
                          ? { ...window.SS_DEFAULT_CONFIG, ...data.config }
                          : window.SS_DEFAULT_CONFIG;
          setProductsState(prods);
          setBannersState(bans);
          setConfigState(cfg);
          if (data.discount_codes?.length) setDiscountCodesState(data.discount_codes);
          if (!data.products?.length) {
            window.sb.from("ss_store").update({
              products: window.SS_PRODUCTS,
              banners:  window.SS_DEFAULT_BANNERS,
              config:   window.SS_DEFAULT_CONFIG,
            }).eq("id", 1).then();
          }
        }
        // Pedidos: tabla dedicada ss_orders (cada pedido es una fila)
        if (!ordErr && ordersRows?.length) {
          setOrdersState(ordersRows.map((r) => ({ ...r.data, status: r.status, id: r.id, ts: r.ts })));
        }
      })
      .finally(() => setDbLoading(false));
  }, []);

  // Setters: actualizan el estado local al instante y persisten en Supabase en background
  const setProducts = useCallback((updater) => {
    setProductsState((prev) => {
      const next = typeof updater === "function" ? updater(prev) : updater;
      window.sb.from("ss_store").update({ products: next }).eq("id", 1).then();
      return next;
    });
  }, []);

  const setBanners = useCallback((updater) => {
    setBannersState((prev) => {
      const next = typeof updater === "function" ? updater(prev) : updater;
      window.sb.from("ss_store").update({ banners: next }).eq("id", 1).then();
      return next;
    });
  }, []);

  const setConfig = useCallback((updater) => {
    setConfigState((prev) => {
      const next = typeof updater === "function" ? updater(prev) : updater;
      window.sb.from("ss_store").update({ config: next }).eq("id", 1).then();
      return next;
    });
  }, []);

  // addOrder: inserta UN pedido nuevo — guarda en localStorage como backup Y en ss_orders
  const addOrder = useCallback((order) => {
    // 1. Estado local inmediato
    setOrdersState((prev) => {
      const next = [order, ...prev];
      // 2. Backup en localStorage (nunca se pierde aunque Supabase falle)
      try { localStorage.setItem("ss_orders_backup", JSON.stringify(next)); } catch {}
      return next;
    });
    // 3. Persistir en tabla dedicada ss_orders
    window.sb.from("ss_orders")
      .insert({ id: order.id, ts: order.ts, status: order.status || "nuevo", data: order })
      .then(({ error }) => {
        if (error) {
          console.error("❌ Error guardando pedido en Supabase:", error.message);
          console.warn("⚠️ Pedido guardado solo en localStorage como backup. Crear tabla ss_orders en Supabase.");
        } else {
          console.log("✅ Pedido guardado en Supabase:", order.id);
        }
      });
  }, []);

  // updateOrderStatus: actualiza el estado de un pedido específico
  const updateOrderStatus = useCallback((id, status) => {
    setOrdersState((prev) => prev.map((o) => o.id === id ? { ...o, status } : o));
    window.sb.from("ss_orders").update({ status }).eq("id", id)
      .then(({ error }) => { if (error) console.error("❌ Error actualizando pedido:", error.message); });
  }, []);

  // deleteOrder: elimina un pedido específico
  const deleteOrder = useCallback((id) => {
    setOrdersState((prev) => prev.filter((o) => o.id !== id));
    window.sb.from("ss_orders").delete().eq("id", id)
      .then(({ error }) => { if (error) console.error("❌ Error eliminando pedido:", error.message); });
  }, []);

  // updateOrderRemito: guarda los datos del remito dentro del pedido
  const updateOrderRemito = useCallback((id, remitoData) => {
    setOrdersState((prev) => prev.map((o) => o.id === id ? { ...o, remito: remitoData } : o));
    window.sb.from("ss_orders").select("data").eq("id", id).single()
      .then(({ data: row }) => {
        const newData = { ...(row?.data || {}), remito: remitoData };
        window.sb.from("ss_orders").update({ data: newData }).eq("id", id)
          .then(({ error }) => { if (error) console.error("❌ Error guardando remito:", error.message);
                                 else console.log("✅ Remito guardado:", id); });
      });
  }, []);

  const setDiscountCodes = useCallback((updater) => {
    setDiscountCodesState((prev) => {
      const next = typeof updater === "function" ? updater(prev) : updater;
      window.sb.from("ss_store").update({ discount_codes: next }).eq("id", 1)
        .then(({ error }) => { if (error) console.error("Error guardando códigos:", error.message); });
      return next;
    });
  }, []);

  const addToCart = useCallback((product, presId, qty = 1) => {
    setCart((prev) => {
      const idx = prev.findIndex((i) => i.productId === product.id && i.presId === presId);
      if (idx >= 0) {
        const next = [...prev];
        next[idx] = { ...next[idx], qty: next[idx].qty + qty };
        return next;
      }
      const pres = product.presentations.find((p) => p.id === presId);
      return [...prev, {
        productId: product.id,
        productName: product.name,
        productImage: product.image || "",
        presId,
        presLabel: pres?.label || "",
        price: pres?.price || 0,
        qty,
      }];
    });
  }, [setCart]);

  const updateQty = useCallback((productId, presId, delta) => {
    setCart((prev) => prev
      .map((i) => i.productId === productId && i.presId === presId ? { ...i, qty: Math.max(0, i.qty + delta) } : i)
      .filter((i) => i.qty > 0)
    );
  }, [setCart]);

  const removeItem = useCallback((productId, presId) => {
    setCart((prev) => prev.filter((i) => !(i.productId === productId && i.presId === presId)));
  }, [setCart]);

  const clearCart = useCallback(() => setCart([]), [setCart]);

  return {
    products, setProducts,
    banners, setBanners,
    config, setConfig,
    cart, setCart, addToCart, updateQty, removeItem, clearCart,
    orders, addOrder, updateOrderStatus, deleteOrder, updateOrderRemito,
    discountCodes, setDiscountCodes,
    auth,
    dbLoading,
  };
}

// =====================================================================
// HEADER / NAV
// =====================================================================
function Header({ store, currentRoute, onCartOpen, onSearchOpen }) {
  const itemCount = store.cart.reduce((s, i) => s + i.qty, 0);
  const isAt = (path) => currentRoute === path;
  const [mobileMenuOpen, setMobileMenuOpen] = useState(false);

  // Cerrar menú al cambiar de ruta
  useEffect(() => { setMobileMenuOpen(false); }, [currentRoute]);

  const CATALOG_URL = "assets/catalogo-somos-setas-2026.pdf";

  const navLinks = (
    <>
      <a href="#"            className={isAt("home")    ? "active" : ""} onClick={() => setMobileMenuOpen(false)}>Inicio</a>
      <a href="#catalogo"    className={isAt("catalogo")? "active" : ""} onClick={() => setMobileMenuOpen(false)}>Catálogo</a>
      <a href="#catalogo/hongos"    onClick={() => setMobileMenuOpen(false)}>Hongos</a>
      <a href="#catalogo/sinergicos" onClick={() => setMobileMenuOpen(false)}>Sinérgicos</a>
      <a href="#filosofia"  onClick={() => setMobileMenuOpen(false)}>Filosofía</a>
    </>
  );

  return (
    <React.Fragment>
      <div className="announcement">
        Envíos a todo el país<span className="dot"></span>Pedidos por WhatsApp<span className="dot"></span>Mendoza · Argentina
      </div>
      <header className="header">
        <div className="container">
          <div className="header-inner">
            <a href="#" className="header-logo" aria-label="Somos Setas — Inicio">
              <img src="assets/logo-vertical.png" alt="Somos Setas" className="header-logo-img"/>
            </a>
            <nav className={"header-nav" + (mobileMenuOpen ? " is-open" : "")}>
              {navLinks}
              <a href={CATALOG_URL} download="Catalogo-Somos-Setas-2026.pdf" className="nav-catalog-btn" onClick={() => setMobileMenuOpen(false)}>
                <Icon.download width="13" height="13"/> Catálogo PDF
              </a>
              <button className="mobile-nav-close icon-btn" aria-label="Cerrar menú" onClick={() => setMobileMenuOpen(false)}>
                <Icon.close width="20" height="20"/>
              </button>
            </nav>
            {mobileMenuOpen && <div className="mobile-nav-overlay" onClick={() => setMobileMenuOpen(false)}/>}
            <div className="header-actions">
              <a href={CATALOG_URL} download="Catalogo-Somos-Setas-2026.pdf" className="btn-catalog-dl" aria-label="Descargar catálogo PDF">
                <Icon.download width="14" height="14"/>
                <span>Catálogo PDF</span>
              </a>
              <button className="icon-btn" aria-label="Buscar" onClick={onSearchOpen}><Icon.search width="18" height="18"/></button>
              <a href="#admin" className="icon-btn" aria-label="Cuenta"><Icon.user width="18" height="18"/></a>
              <button className="cart-pill" onClick={onCartOpen}>
                <Icon.bag width="16" height="16"/>
                <span className="cart-label">Carrito</span> <span className="count">({itemCount})</span>
              </button>
              <button className="hamburger icon-btn" aria-label="Menú" onClick={() => setMobileMenuOpen(true)}>
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" width="22" height="22">
                  <path d="M3 6h18M3 12h18M3 18h18"/>
                </svg>
              </button>
            </div>
          </div>
        </div>
      </header>
    </React.Fragment>
  );
}

// =====================================================================
// SEARCH MODAL
// =====================================================================
function SearchModal({ open, store, onClose }) {
  const [query, setQuery] = useState("");
  const inputRef = useRef(null);

  useEffect(() => {
    if (open) {
      setQuery("");
      setTimeout(() => inputRef.current?.focus(), 50);
    }
  }, [open]);

  useEffect(() => {
    const handler = (e) => { if (e.key === "Escape") onClose(); };
    document.addEventListener("keydown", handler);
    return () => document.removeEventListener("keydown", handler);
  }, [onClose]);

  const q = query.trim().toLowerCase();
  const results = q.length < 2 ? [] : store.products.filter((p) => p.visible !== false).filter((p) => {
    const cat = window.SS_CATEGORIES.find((c) => c.id === p.category);
    return (
      p.name.toLowerCase().includes(q) ||
      (p.tagline || "").toLowerCase().includes(q) ||
      (p.description || "").toLowerCase().includes(q) ||
      (cat?.name || "").toLowerCase().includes(q)
    );
  });

  if (!open) return null;

  return (
    <div className="search-overlay" onClick={onClose}>
      <div className="search-box" onClick={(e) => e.stopPropagation()}>
        <div className="search-input-row">
          <Icon.search width="18" height="18" style={{flexShrink: 0, color: "var(--ink-3)"}}/>
          <input
            ref={inputRef}
            type="text"
            placeholder="Buscar productos…"
            value={query}
            onChange={(e) => setQuery(e.target.value)}
            className="search-input"
          />
          <button className="icon-btn" onClick={onClose}><Icon.close width="18" height="18"/></button>
        </div>
        {q.length >= 2 ? (
          <div className="search-results">
            {results.length === 0 ? (
              <div className="search-empty">Sin resultados para "<strong>{query}</strong>"</div>
            ) : results.map((p) => {
              const cat = window.SS_CATEGORIES.find((c) => c.id === p.category);
              return (
                <a key={p.id} href={`#producto/${p.id}`} className="search-result-item" onClick={onClose}>
                  <div className={"search-result-img" + (p.image ? "" : " empty")}>
                    {p.image && <img src={p.image} alt={p.name}/>}
                  </div>
                  <div className="search-result-info">
                    <div className="search-result-name">{p.name}</div>
                    <div className="search-result-meta">{cat?.name}{p.tagline ? ` · ${p.tagline}` : ""}</div>
                  </div>
                  <Icon.arrow width="16" height="16" style={{color: "var(--ink-3)", flexShrink: 0}}/>
                </a>
              );
            })}
          </div>
        ) : (
          <div className="search-hint">Escribí al menos 2 caracteres para buscar</div>
        )}
      </div>
    </div>
  );
}

// =====================================================================
// BANNER CAROUSEL
// =====================================================================
function BannerCarousel({ banners }) {
  const active = banners.filter((b) => b.active);
  const [idx, setIdx] = useState(0);
  useEffect(() => {
    if (active.length <= 1) return;
    const t = setInterval(() => setIdx((i) => (i + 1) % active.length), 6000);
    return () => clearInterval(t);
  }, [active.length]);
  if (!active.length) return null;
  const go = (d) => setIdx((i) => (i + d + active.length) % active.length);

  return (
    <section className="banner" aria-label="Promociones">
      {active.map((b, i) => {
        const bgImage = b.gallery?.[0] || b.image || "";
        const video = parseVideoUrl(b.video);
        return (
          <div
            key={b.id}
            className={"banner-slide" + (i === idx ? " is-active" : "")}
            style={{ background: b.bg, color: b.fg }}
          >
            {/* Fondo: video o imagen */}
            {video ? (
              video.type === "direct"
                ? <video src={video.url} autoPlay muted loop playsInline className="banner-bg-video"/>
                : <iframe src={video.embed} className="banner-bg-video" frameBorder="0"
                    allow="autoplay; muted" title="Banner video"/>
            ) : bgImage ? (
              <img src={bgImage} alt="" style={{
                position: "absolute", inset: 0, width: "100%", height: "100%",
                objectFit: "cover", opacity: 0.35, pointerEvents: "none",
              }}/>
            ) : null}

            <div className="banner-slide-content">
              <span className="eyebrow" style={{color: b.fg}}>{b.eyebrow}</span>
              <h1>{b.title}</h1>
              <p>{b.subtitle}</p>
              <a href={b.ctaHref} className="banner-cta" style={{background: b.accent, color: b.bg}}>
                {b.ctaLabel}
                <Icon.arrow width="14" height="14"/>
              </a>
            </div>
          </div>
        );
      })}
      {active.length > 1 && (
        <React.Fragment>
          <button className="banner-arrow left" onClick={() => go(-1)} aria-label="Anterior"><Icon.arrowL width="18" height="18" stroke="white"/></button>
          <button className="banner-arrow right" onClick={() => go(1)} aria-label="Siguiente"><Icon.arrow width="18" height="18" stroke="white"/></button>
          <div className="banner-dots">
            {active.map((_, i) => (
              <button key={i} className={"banner-dot" + (i === idx ? " is-active" : "")} onClick={() => setIdx(i)} aria-label={`Slide ${i+1}`}/>
            ))}
          </div>
        </React.Fragment>
      )}
    </section>
  );
}

// =====================================================================
// PRODUCT CARD
// =====================================================================
function ProductCard({ product, onQuickAdd }) {
  const minPrice = Math.min(...product.presentations.map((p) => p.price));
  const cat = window.SS_CATEGORIES.find((c) => c.id === product.category)?.name;
  return (
    <a href={`#producto/${product.id}`} className="card">
      <div className={"card-img" + (product.image ? "" : " empty")} data-label="Producto">
        {product.image && <img src={product.image} alt={product.name}/>}
        {product.promoted && <span className="card-badge is-promo">Promo</span>}
        {!product.promoted && product.featured && <span className="card-badge">Destacado</span>}
        <div className="card-quick">
          <button onClick={(e) => { e.preventDefault(); onQuickAdd(product); }}>
            + Agregar
          </button>
        </div>
      </div>
      <div className="card-cat">{cat}</div>
      <h3 className="card-title">{product.name}</h3>
      {product.scientific && <div className="card-sub">{product.scientific}</div>}
      <div className="card-price"><small>Desde </small>{fmtPrice(minPrice)}</div>
    </a>
  );
}

// =====================================================================
// HOMEPAGE
// =====================================================================
function HomePage({ store, onQuickAdd }) {
  const featured = store.products.filter((p) => p.featured && p.visible !== false).slice(0, 4);
  const hongos = store.products.filter((p) => p.category === "hongos" && p.visible !== false).slice(0, 8);

  return (
    <main>
      <BannerCarousel banners={store.banners}/>

      {/* Pricing tiers */}
      <section className="section tiers-section" id="beneficios">
        <div className="container">
          <div className="section-header">
            <div>
              <span className="eyebrow">Comprá más, pagá menos</span>
              <h2>Beneficios por volumen</h2>
            </div>
            <a href="#catalogo" className="section-link">Ir al catálogo →</a>
          </div>
          <div className="tiers-grid">
            <div className="tier-card is-highlight-mid">
              <h3 className="tier-card-title">Envío Gratis</h3>
              <p className="tier-card-sub">En compras de $150.000 o más</p>
              <div className="tier-card-andreani">
                <img src="assets/andreani.png" alt="Andreani" className="tier-andreani-logo"/>
                <span>Rápido despacho</span>
              </div>
              <a href="#catalogo" className="tier-card-cta">Armar pedido →</a>
            </div>
            <div className="tier-card is-highlight">
              <div className="tier-card-badge">Más popular</div>
              <h3 className="tier-card-title">Mayorista</h3>
              <p className="tier-card-sub">En compras de $250.000 o más</p>
              <ul className="tier-card-perks">
                <li>✔ <strong>30% de descuento</strong> en todo el pedido</li>
                <li>✔ <strong>Envío gratis</strong> a sucursal Andreani</li>
              </ul>
              <div className="tier-card-andreani">
                <img src="assets/andreani.png" alt="Andreani" className="tier-andreani-logo"/>
                <span>Rápido despacho</span>
              </div>
              <a href="#catalogo" className="tier-card-cta">Armar pedido →</a>
            </div>
            <div className="tier-card is-highlight-top">
              <div className="tier-card-badge">Mejor precio</div>
              <h3 className="tier-card-title">Distribuidor</h3>
              <p className="tier-card-sub">En compras de $500.000 o más</p>
              <ul className="tier-card-perks">
                <li>✔ <strong>45% de descuento</strong> en todo el pedido</li>
                <li>✔ <strong>Envío gratis</strong> a sucursal Andreani</li>
                <li>✔ <strong>Envío gratis</strong> a domicilio también</li>
              </ul>
              <div className="tier-card-andreani">
                <img src="assets/andreani.png" alt="Andreani" className="tier-andreani-logo"/>
                <span>Rápido despacho</span>
              </div>
              <a href="#catalogo" className="tier-card-cta">Armar pedido →</a>
            </div>
          </div>
        </div>
      </section>

      <div className="container">
        <nav className="cat-strip">
          {window.SS_CATEGORIES.map((c, i) => (
            <a key={c.id} href={`#catalogo/${c.slug}`}>
              <span className="num">0{i+1}</span>
              <span className="nm">{c.name}</span>
            </a>
          ))}
        </nav>
      </div>

      {/* Featured */}
      <section className="section">
        <div className="container">
          <div className="section-header">
            <div>
              <span className="eyebrow">Selección de la casa</span>
              <h2>Destacados</h2>
            </div>
            <a href="#catalogo" className="section-link">Ver todo el catálogo →</a>
          </div>
          <div className="grid grid-4">
            {featured.map((p) => <ProductCard key={p.id} product={p} onQuickAdd={onQuickAdd}/>)}
          </div>
        </div>
      </section>

      {/* Philosophy */}
      <section className="philo" id="filosofia">
        <img src="assets/local-somos-setas.jpg" alt="Local Somos Setas" className="philo-bg-img"/>
        <div className="container" style={{position:"relative", zIndex:1}}>
          <div className="philo-grid">
            <blockquote>
              Somos la sabiduría de <em>mil millones de años</em>. Somos creación y resurrección, somos la sanación, somos vida después de la muerte. <em>Somos setas.</em>
            </blockquote>
            <div className="philo-side">
              <span className="eyebrow">Nuestra filosofía</span>
              <p>Trabajamos con hongos adaptógenos: sustancias naturales que ayudan al cuerpo a adaptarse y hacer frente a las afecciones de la salud. Ancestralmente utilizados para mejorar la calidad de vida.</p>
              <p>Nuestros extractos provienen de una tecnología de vanguardia: cavitación molecular por ultrasonido. Una mayor cantidad de moléculas bioactivas, extractos más sanos, más seguros y con menor impacto ambiental.</p>
            </div>
          </div>
        </div>
      </section>

      {/* Hongos */}
      <section className="section">
        <div className="container">
          <div className="section-header">
            <div>
              <span className="eyebrow">Línea principal</span>
              <h2>Hongos Adaptógenos</h2>
            </div>
            <a href="#catalogo/hongos" className="section-link">Ver todos →</a>
          </div>
          <div className="grid grid-4">
            {hongos.map((p) => <ProductCard key={p.id} product={p} onQuickAdd={onQuickAdd}/>)}
          </div>
        </div>
      </section>

      {/* Facts */}
      <section>
        <div className="container">
          <div className="facts">
            <div className="fact"><h4>Ratio 10:1</h4><p>Extracciones concentradas: 10 g de materia para 1 g de extracto.</p></div>
            <div className="fact"><h4>Cavitación</h4><p>Tecnología por ultrasonido: más moléculas bioactivas disponibles.</p></div>
            <div className="fact"><h4>Sin Azúcar</h4><p>Formulaciones sin azúcares añadidos. Aptos para una alimentación consciente y saludable.</p></div>
            <div className="fact"><h4>Mendoza</h4><p>Producido en Godoy Cruz, Mendoza. Envíos a todo el país.</p></div>
          </div>
        </div>
      </section>


      {/* How to buy */}
      <section className="section" id="como-comprar">
        <div className="container">
          <div className="section-header">
            <div>
              <span className="eyebrow">Cómo comprar</span>
              <h2>Tu pedido por WhatsApp</h2>
            </div>
          </div>
          <div className="steps">
            <div className="step">
              <div className="num">01 / Elegí</div>
              <h3>Armá tu carrito</h3>
              <p>Navegá el catálogo, leé los beneficios de cada producto y agregá las presentaciones que necesites.</p>
            </div>
            <div className="step">
              <div className="num">02 / Coordiná</div>
              <h3>Confirmá por WhatsApp</h3>
              <p>Al finalizar, tu pedido se arma como mensaje y se envía a nuestro WhatsApp para coordinar pago y envío.</p>
            </div>
            <div className="step">
              <div className="num">03 / Recibí</div>
              <h3>Envíos a todo el país</h3>
              <p>Despachamos a todo el país. En Mendoza coordinamos retiro o entrega según tu zona.</p>
            </div>
          </div>
        </div>
      </section>
    </main>
  );
}

// =====================================================================
// CATALOG PAGE
// =====================================================================
function CatalogPage({ store, onQuickAdd, slug: catSlug }) {
  const currentCat = window.SS_CATEGORIES.find((c) => c.slug === catSlug);
  const [filter, setFilter] = useState(catSlug || "all");

  useEffect(() => { setFilter(catSlug || "all"); }, [catSlug]);

  const products = useMemo(() => {
    return store.products.filter((p) => {
      if (p.visible === false) return false;
      if (filter === "all") return true;
      // Compatibilidad con IDs antiguos almacenados en Supabase
      if (filter === "suplementos") return ["suplementos", "capsulas", "polvos"].includes(p.category);
      return p.category === filter;
    });
  }, [filter, store.products]);

  return (
    <main>
      <div className="cat-head">
        <div className="container">
          <span className="eyebrow">Catálogo 2026</span>
          <h1>{currentCat ? currentCat.name : "Todo el catálogo"}</h1>
          <p>
            {currentCat
              ? "Explorá los beneficios, presentaciones y modo de consumo de cada producto."
              : "Hongos adaptógenos, sinérgicos, aceites comestibles, suplementos y raíces/plantas."}
          </p>
        </div>
      </div>

      <div className="container">
        <div className="cat-toolbar">
          <div className="chip-row">
            <a href="#catalogo" className={"chip" + (filter === "all" ? " is-active" : "")}>Todos</a>
            {window.SS_CATEGORIES.map((c) => (
              <a key={c.id} href={`#catalogo/${c.slug}`} className={"chip" + (filter === c.id ? " is-active" : "")}>{c.name}</a>
            ))}
          </div>
          <span className="mono" style={{fontSize: 12, color: "var(--ink-3)"}}>{products.length} productos</span>
        </div>
        <div className="grid grid-4" style={{paddingBottom: 88}}>
          {products.map((p) => <ProductCard key={p.id} product={p} onQuickAdd={onQuickAdd}/>)}
        </div>
      </div>
    </main>
  );
}

// =====================================================================
// PRODUCT DETAIL
// =====================================================================
function ProductDetailPage({ store, productId }) {
  const product = store.products.find((p) => p.id === productId);
  const [selections, setSelections] = useState({});
  const [added, setAdded] = useState(false);
  const [mediaIdx, setMediaIdx] = useState(0);

  useEffect(() => { setSelections({}); setMediaIdx(0); }, [productId]);

  if (!product) {
    return (
      <main className="container" style={{padding: "80px 0", textAlign: "center"}}>
        <h2 className="display" style={{fontSize: 48}}>Producto no encontrado</h2>
        <a href="#catalogo" className="section-link" style={{marginTop: 24, display: "inline-block"}}>Volver al catálogo</a>
      </main>
    );
  }

  // Construir lista de medios: imágenes de galería + video al final
  const gallery = product.gallery?.length ? product.gallery : (product.image ? [product.image] : []);
  const video = parseVideoUrl(product.video);
  const mediaItems = [
    ...gallery.map((url) => ({ type: "image", url })),
    ...(video ? [{ type: "video", video }] : []),
  ];
  const currentMedia = mediaItems[mediaIdx] || null;

  const cat = window.SS_CATEGORIES.find((c) => c.id === product.category);
  const total = Object.entries(selections).reduce((sum, [pid, qty]) => {
    const pres = product.presentations.find((p) => p.id === pid);
    return sum + (pres?.price || 0) * qty;
  }, 0);
  const hasSelections = Object.keys(selections).length > 0;

  const togglePres = (pid) => {
    setSelections((prev) => {
      if (prev[pid]) { const n = {...prev}; delete n[pid]; return n; }
      return {...prev, [pid]: 1};
    });
  };
  const changeQty = (pid, delta) => {
    setSelections((prev) => {
      const next = Math.max(1, (prev[pid] || 1) + delta);
      return {...prev, [pid]: next};
    });
  };
  const handleAdd = () => {
    Object.entries(selections).forEach(([pid, qty]) => store.addToCart(product, pid, qty));
    setAdded(true);
    setTimeout(() => { setAdded(false); setSelections({}); }, 1800);
  };

  return (
    <main className="pd">
      <div className="container">
        <div className="breadcrumb">
          <a href="#">Inicio</a>
          <span className="sep">/</span>
          <a href={`#catalogo/${cat?.slug}`}>{cat?.name}</a>
          <span className="sep">/</span>
          {product.name}
        </div>

        <div className="pd-grid">
          {/* Galería de medios */}
          <div className="pd-media">
            <div className={"pd-img" + (!currentMedia ? " empty" : "")} data-label={`Foto · ${product.name}`}>
              {currentMedia?.type === "image" && (
                <img src={currentMedia.url} alt={product.name}/>
              )}
              {currentMedia?.type === "video" && (
                currentMedia.video.type === "direct"
                  ? <video src={currentMedia.video.url} controls playsInline style={{width:"100%",height:"100%",objectFit:"cover"}}/>
                  : <iframe src={currentMedia.video.embed} frameBorder="0" allow="autoplay; fullscreen"
                      allowFullScreen style={{width:"100%",height:"100%",border:"none"}} title="Video del producto"/>
              )}
              {!currentMedia && <span style={{color:"var(--ink-3)",fontSize:12}}>Sin imagen</span>}

              {/* Flechas de navegación */}
              {mediaItems.length > 1 && (
                <React.Fragment>
                  <button
                    className="pd-arrow pd-arrow-left"
                    onClick={() => setMediaIdx((i) => (i - 1 + mediaItems.length) % mediaItems.length)}
                    aria-label="Anterior"
                  >
                    <Icon.arrowL width="18" height="18"/>
                  </button>
                  <button
                    className="pd-arrow pd-arrow-right"
                    onClick={() => setMediaIdx((i) => (i + 1) % mediaItems.length)}
                    aria-label="Siguiente"
                  >
                    <Icon.arrow width="18" height="18"/>
                  </button>
                  <div className="pd-dots">
                    {mediaItems.map((_, i) => (
                      <button key={i} className={"pd-dot" + (i === mediaIdx ? " is-active" : "")} onClick={() => setMediaIdx(i)} aria-label={`Media ${i+1}`}/>
                    ))}
                  </div>
                </React.Fragment>
              )}
            </div>
            {/* Miniaturas cuando hay más de un medio */}
            {mediaItems.length > 1 && (
              <div className="pd-thumbs">
                {mediaItems.map((item, i) => (
                  <button
                    key={i}
                    className={"pd-thumb" + (i === mediaIdx ? " is-active" : "")}
                    onClick={() => setMediaIdx(i)}
                    aria-label={item.type === "video" ? "Ver video" : `Foto ${i + 1}`}
                  >
                    {item.type === "video"
                      ? <span className="pd-thumb-play">▶</span>
                      : <img src={item.url} alt=""/>}
                  </button>
                ))}
              </div>
            )}
          </div>

          <div>
            <h1 className="pd-title">{product.name}</h1>
            {product.scientific && <div className="pd-sci">{product.scientific}</div>}
            <div className="pd-tag">{product.tagline}</div>
            <p className="pd-desc">{product.description}</p>

            <div className="pd-section">
              <h3>Beneficios principales</h3>
              <ul className="pd-benefits">
                {product.benefits.map((b, i) => (
                  <li key={i}><span className="b-num">{String(i+1).padStart(2, "0")}</span><span>{b}</span></li>
                ))}
              </ul>
            </div>

            <div className="pd-section">
              <h3>Presentaciones disponibles</h3>
              <div className="pres-list">
                {product.presentations.map((p) => {
                  const selected = !!selections[p.id];
                  return (
                    <div key={p.id} className={"pres-row" + (selected ? " is-selected" : "")}
                         onClick={() => togglePres(p.id)} style={{cursor:"pointer"}}>
                      <span className="checkbox">{selected ? "✓" : ""}</span>
                      <span className="pres-label">{p.label}</span>
                      {selected && (
                        <div className="pres-qty" onClick={(e) => e.stopPropagation()}>
                          <button onClick={() => changeQty(p.id, -1)}>−</button>
                          <span>{selections[p.id]}</span>
                          <button onClick={() => changeQty(p.id, 1)}>+</button>
                        </div>
                      )}
                      <span className="pres-price">{fmtPrice(p.price)}</span>
                    </div>
                  );
                })}
              </div>

              <div className="qty-row">
                <button
                  className={"btn-add" + (added ? " is-added" : "") + (!hasSelections ? " is-disabled" : "")}
                  onClick={handleAdd} disabled={!hasSelections}
                >
                  {added ? "✓ Agregado al carrito"
                    : hasSelections ? <>Agregar — {fmtPrice(total)}</>
                    : "Seleccioná una presentación"}
                </button>
              </div>
            </div>

            <div className="pd-section">
              <h3>Modo de consumo</h3>
              <p style={{margin: 0, fontSize: 14, color: "var(--ink-2)", lineHeight: 1.6}}>
                Se recomienda siempre seguir las instrucciones del envase. <strong>Importante:</strong> personas con enfermedades autoinmunes (lupus, artritis, esclerosis múltiple), hipertiroidismo, problemas de tiroides, embarazadas o en lactancia, y quienes toman sedantes, antidepresivos o medicamentos para la presión/diabetes deben solicitar asesoría médica.
              </p>
            </div>
          </div>
        </div>
      </div>

      {/* Productos similares */}
      {(() => {
        const similar = store.products.filter((p) => p.visible !== false && p.id !== product.id && p.category === product.category).slice(0, 5);
        if (!similar.length) return null;
        return (
          <div className="container" style={{paddingTop: 0, paddingBottom: 48}}>
            <div className="section-header" style={{marginBottom: 20}}>
              <div>
                <span className="eyebrow">Del mismo tipo</span>
                <h3 style={{margin: 0}}>Productos similares</h3>
              </div>
            </div>
            <div className="grid grid-4">
              {similar.map((p) => <ProductCard key={p.id} product={p}/>)}
            </div>
          </div>
        );
      })()}
    </main>
  );
}

// =====================================================================
// CART DRAWER
// =====================================================================
const SHIPPING_BRANCH       = 4500;
const SHIPPING_HOME         = 7500;
const SHIPPING_HOME_UPGRADE = 3000; // diferencia domicilio − sucursal (para tiers con sucursal gratis)

function CartDrawer({ open, store, onClose, onCheckout }) {
  const [codeInput, setCodeInput] = useState("");
  const [appliedCode, setAppliedCode] = useState(null);
  const [codeError, setCodeError] = useState("");
  const [deliveryType, setDeliveryType] = useState("sucursal"); // "sucursal" | "domicilio" | "local"

  const applyCode = () => {
    setCodeError("");
    const raw = codeInput.trim().toUpperCase();
    if (!raw) return;
    const dc = (store.discountCodes || []).find((c) => c.code.toUpperCase() === raw);
    if (!dc) { setCodeError("Código no válido"); return; }
    if (!dc.active) { setCodeError("Este código no está activo"); return; }
    const now = new Date();
    if (dc.startsAt && new Date(dc.startsAt) > now) { setCodeError("Este código aún no está vigente"); return; }
    if (dc.expiresAt && new Date(dc.expiresAt) < now) { setCodeError("Este código expiró"); return; }
    if (dc.maxUses && dc.usedCount >= dc.maxUses) { setCodeError("Este código alcanzó su límite de usos"); return; }
    if (dc.minSubtotal && subtotal < dc.minSubtotal) { setCodeError(`Monto mínimo: ${fmtPrice(dc.minSubtotal)}`); return; }
    setAppliedCode(dc);
    setCodeInput("");
  };

  const removeCode = () => { setAppliedCode(null); setCodeError(""); setCodeInput(""); };

  const subtotal = store.cart.reduce((s, i) => s + i.price * i.qty, 0);
  const tier = getPricingTier(subtotal);
  const tierDiscAmt = Math.round(subtotal * tier.discount);
  const afterTier = subtotal - tierDiscAmt;

  // Descuento por código
  const couponDiscAmt = appliedCode
    ? appliedCode.type === "fixed"
      ? Math.min(appliedCode.value, afterTier)
      : Math.round(afterTier * appliedCode.value / 100)
    : 0;
  const couponFreeShipping = appliedCode?.appliesToShipping || false;
  const isFreeShipping = tier.freeShipping || couponFreeShipping;

  // Costo de envío según tipo de entrega y tier
  // local: siempre gratis (retiro en local)
  // freeToBranch: sucursal siempre gratis; domicilio paga solo la diferencia ($3.000)
  // freeShipping: sucursal Y domicilio gratis
  let shippingCost = 0;
  if (deliveryType === "local") {
    shippingCost = 0;
  } else if (!isFreeShipping) {
    if (tier.freeToBranch) {
      shippingCost = deliveryType === "domicilio" ? SHIPPING_HOME_UPGRADE : 0;
    } else if (deliveryType === "sucursal") {
      shippingCost = SHIPPING_BRANCH;
    } else {
      shippingCost = SHIPPING_HOME;
    }
  }

  const total = afterTier - couponDiscAmt + shippingCost;
  const discountAmt = tierDiscAmt;
  const nextThreshold = tier.next ? tier.next.threshold : null;
  const progress = nextThreshold ? Math.min(subtotal / nextThreshold, 1) : 1;
  const remaining = nextThreshold ? nextThreshold - subtotal : 0;

  return (
    <React.Fragment>
      <div className={"cart-overlay" + (open ? " is-open" : "")} onClick={onClose}></div>
      <aside className={"cart-drawer" + (open ? " is-open" : "")}>
        <div className="cart-head">
          <h3>Tu carrito</h3>
          <button className="icon-btn" onClick={onClose}><Icon.close width="18" height="18"/></button>
        </div>

        {store.cart.length === 0 ? (
          <div className="cart-empty">
            <h4>Tu carrito está vacío</h4>
            <p>Explorá el catálogo y agregá productos para coordinar tu pedido por WhatsApp.</p>
            <a href="#catalogo" className="btn-primary" onClick={onClose} style={{marginTop: 16}}>Ir al catálogo</a>
          </div>
        ) : (
          <React.Fragment>
            <div className="cart-body">
              {store.cart.map((item) => {
                // Imagen: guardada en el item (nuevos) o buscada en productos (items viejos del localStorage)
                const imgSrc = item.productImage || store.products.find((p) => p.id === item.productId)?.image || "";
                return (
                <div key={item.productId + item.presId} className="cart-item">
                  <div className="cart-item-img">
                    {imgSrc
                      ? <img src={imgSrc} alt={item.productName}/>
                      : null}
                  </div>
                  <div className="cart-item-info">
                    <h4>{item.productName}</h4>
                    <div className="pres">{item.presLabel}</div>
                    <div className="qty-mini">
                      <button onClick={() => store.updateQty(item.productId, item.presId, -1)}>−</button>
                      <span className="v">{item.qty}</span>
                      <button onClick={() => store.updateQty(item.productId, item.presId, 1)}>+</button>
                    </div>
                  </div>
                  <div>
                    <div className="cart-item-price">{fmtPrice(item.price * item.qty)}</div>
                    <button className="cart-item-remove" onClick={() => store.removeItem(item.productId, item.presId)}>Quitar</button>
                  </div>
                </div>
                );
              })}
            </div>
            <div className="cart-foot">
              {/* Tier progress indicator */}
              {tier.next ? (
                <div className="tier-progress">
                  <div className="tier-progress-bar">
                    <div className="tier-progress-fill" style={{width: `${progress * 100}%`}}></div>
                  </div>
                  <p className="tier-progress-msg">
                    Te faltan <strong>{fmtPrice(remaining)}</strong> para {tier.next.label}
                  </p>
                </div>
              ) : (
                <div className="tier-reached">
                  🏆 Precio Distribuidor activo — 45% de descuento + envío gratis
                </div>
              )}

              {/* Campo de código de descuento */}
              <div className="coupon-row">
                {appliedCode ? (
                  <div className="coupon-applied">
                    <span>🏷 <strong>{appliedCode.code}</strong> aplicado</span>
                    <button onClick={removeCode} className="coupon-remove">Quitar</button>
                  </div>
                ) : (
                  <div className="coupon-input-row">
                    <input
                      type="text" value={codeInput}
                      onChange={(e) => { setCodeInput(e.target.value.toUpperCase()); setCodeError(""); }}
                      onKeyDown={(e) => e.key === "Enter" && applyCode()}
                      placeholder="Código de descuento"
                      className="coupon-input"
                    />
                    <button className="coupon-btn" onClick={applyCode}>Aplicar</button>
                  </div>
                )}
                {codeError && <p className="coupon-error">{codeError}</p>}
              </div>

              <div className="cart-row" style={{fontSize: 13, color: "var(--ink-3)"}}>
                <span>Subtotal</span>
                <span className="mono">{fmtPrice(subtotal)}</span>
              </div>
              {tier.discount > 0 && (
                <div className="cart-row" style={{fontSize: 13, color: "#2a9d5c", fontWeight: 600}}>
                  <span>Descuento {tier.name} ({Math.round(tier.discount * 100)}%)</span>
                  <span className="mono">− {fmtPrice(tierDiscAmt)}</span>
                </div>
              )}
              {couponDiscAmt > 0 && (
                <div className="cart-row" style={{fontSize: 13, color: "#2a9d5c", fontWeight: 600}}>
                  <span>Cupón {appliedCode.code} ({appliedCode.type === "fixed" ? fmtPrice(appliedCode.value) : `${appliedCode.value}%`})</span>
                  <span className="mono">− {fmtPrice(couponDiscAmt)}</span>
                </div>
              )}
              {/* Toggle de tipo de envío */}
              <div className="shipping-toggle-block">
                <div className="shipping-toggle-label">
                  <img src="assets/andreani.png" alt="Andreani" className="andreani-logo"/>
                  <span>Tipo de envío</span>
                </div>
                <div className="shipping-opts">
                  <button
                    className={"shipping-opt" + (deliveryType === "sucursal" ? " is-active" : "")}
                    onClick={() => setDeliveryType("sucursal")}
                  >
                    <span className="shipping-opt-title">Sucursal Andreani</span>
                    <span className="shipping-opt-price">
                      {(isFreeShipping || tier.freeToBranch) ? "✓ Gratis" : fmtPrice(SHIPPING_BRANCH)}
                    </span>
                  </button>
                  <button
                    className={"shipping-opt" + (deliveryType === "domicilio" ? " is-active" : "")}
                    onClick={() => setDeliveryType("domicilio")}
                  >
                    <span className="shipping-opt-title">A domicilio</span>
                    <span className="shipping-opt-price">
                      {isFreeShipping
                        ? "✓ Gratis"
                        : tier.freeToBranch
                          ? `+ ${fmtPrice(SHIPPING_HOME_UPGRADE)} (dif.)`
                          : fmtPrice(SHIPPING_HOME)}
                    </span>
                  </button>
                  <button
                    className={"shipping-opt" + (deliveryType === "local" ? " is-active" : "")}
                    onClick={() => setDeliveryType("local")}
                  >
                    <span className="shipping-opt-title">Retiro en local</span>
                    <span className="shipping-opt-price">✓ Gratis</span>
                  </button>
                </div>
              </div>
              <div className="cart-row total">
                <span>Total</span>
                <span className="val">{fmtPrice(total)}</span>
              </div>
              <button className="btn-checkout" onClick={() => onCheckout({ appliedCode, couponDiscAmt, couponFreeShipping, deliveryType, shippingCost, total })}>
                <img src="assets/whatsapp-logo.png" alt="" style={{width:22,height:22,display:"block"}}/>
                Finalizar por WhatsApp
              </button>
            </div>
          </React.Fragment>
        )}
      </aside>
    </React.Fragment>
  );
}

// =====================================================================
// WHATSAPP CHECKOUT MODAL
// =====================================================================
function WhatsAppCheckout({ open, store, onClose, cartSummary }) {
  const [name, setName] = useState("");
  const [email, setEmail] = useState("");
  const [city, setCity] = useState("");
  const [postalCode, setPostalCode] = useState("");
  const [contactType, setContactType] = useState("whatsapp");
  const [contact, setContact] = useState("");
  const [notes, setNotes] = useState("");

  const subtotal = store.cart.reduce((s, i) => s + i.price * i.qty, 0);
  const tier = getPricingTier(subtotal);
  const tierDiscAmt = Math.round(subtotal * tier.discount);
  const afterTier = subtotal - tierDiscAmt;

  // Datos del código aplicado que vienen del carrito
  const appliedCode    = cartSummary?.appliedCode    || null;
  const couponDiscAmt  = cartSummary?.couponDiscAmt  || 0;
  const couponFreeShip = cartSummary?.couponFreeShipping || false;
  const deliveryType   = cartSummary?.deliveryType   || "sucursal";
  const shippingCost   = cartSummary?.shippingCost   || 0;
  const freeShipping   = tier.freeShipping || couponFreeShip;
  const total          = cartSummary?.total ?? (afterTier - couponDiscAmt);

  const contactLabel = { whatsapp: "WhatsApp", telefono: "Teléfono", email: "Email", instagram: "Instagram" }[contactType];

  const message = useMemo(() => {
    const lines = [
      "*🍄 Pedido — SOMOS SETAS*",
      "",
      `*Cliente:* ${name || "—"}`,
      `*Email:* ${email || "—"}`,
      `*Localidad:* ${city || "—"}`,
      postalCode ? `*Código postal:* ${postalCode}` : null,
      `*Entrega:* ${deliveryType === "local" ? "Retiro en local" : deliveryType === "domicilio" ? "A domicilio" : "Retiro en sucursal Andreani más cercana"}`,
      `*Contacto (${contactLabel}):* ${contact || "—"}`,
      "",
      "*Productos:*",
      ...store.cart.map((i) => `• ${i.qty}× ${i.productName} — ${i.presLabel}  (${fmtPrice(i.price * i.qty)})`),
      "",
      `*Subtotal:* ${fmtPrice(subtotal)}`,
    ].filter((l) => l !== null);
    if (tierDiscAmt > 0) lines.push(`*Descuento ${tier.name} (${Math.round(tier.discount * 100)}%):* − ${fmtPrice(tierDiscAmt)}`);
    if (couponDiscAmt > 0) lines.push(`*Cupón ${appliedCode?.code}:* − ${fmtPrice(couponDiscAmt)}`);
    const shippingLabel = shippingCost === 0
      ? "Gratis ✓"
      : deliveryType === "domicilio"
        ? `A domicilio — ${fmtPrice(shippingCost)}`
        : `Sucursal Andreani — ${fmtPrice(shippingCost)}`;
    lines.push(`*Envío:* ${shippingLabel}`);
    lines.push(`*TOTAL:* ${fmtPrice(total)}`);
    if (notes.trim()) lines.push("", `*Notas:* ${notes}`);
    lines.push("", "_Pedido generado desde la web somossetas.com.ar_");
    return lines.join("\n");
  }, [name, email, city, postalCode, deliveryType, contactType, contact, contactLabel, notes, store.cart, subtotal, tier, tierDiscAmt, couponDiscAmt, appliedCode, shippingCost, total]);

  if (!open) return null;

  const contactPlaceholder = {
    whatsapp: "Ej. +54 261 555-0000",
    telefono: "Ej. +54 261 555-0000",
    email: "Ej. nombre@email.com",
    instagram: "Ej. @usuario",
  }[contactType];

  const canSend = name.trim() && email.trim() && city.trim() && contact.trim();

  const send = () => {
    if (!canSend) return;
    const url = `https://wa.me/${store.config.whatsapp}?text=${encodeURIComponent(message)}`;
    store.addOrder({
      id: "ORD-" + Date.now().toString(36).toUpperCase(),
      ts: Date.now(),
      name, email, city, postalCode,
      entregaTipo: deliveryType,
      contact: `${contactLabel}: ${contact}`, notes,
      items: store.cart,
      subtotal, tierDiscAmt, tierName: tier.name,
      couponCode: appliedCode?.code || null, couponDiscAmt,
      shippingCost,
      total,
      status: "nuevo",
    });
    // Incrementar contador de usos del cupón
    if (appliedCode) {
      store.setDiscountCodes((prev) =>
        prev.map((dc) => dc.id === appliedCode.id ? { ...dc, usedCount: (dc.usedCount || 0) + 1 } : dc)
      );
    }
    window.open(url, "_blank");
    store.clearCart();
    onClose();
  };

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={(e) => e.stopPropagation()}>
        <div className="modal-head">
          <h3>Finalizar pedido por WhatsApp</h3>
          <button className="icon-btn" onClick={onClose}><Icon.close width="18" height="18"/></button>
        </div>
        <div className="modal-body wa-modal-body">
          <p>Completá tus datos y revisamos el pedido. Al confirmar, se abrirá WhatsApp con el mensaje listo para enviarnos.</p>
          <div className="field-row">
            <div className="field">
              <label>Nombre completo <span style={{color:"var(--primary)"}}>*</span></label>
              <input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder="Ej. María González" required/>
            </div>
            <div className="field">
              <label>Email <span style={{color:"var(--primary)"}}>*</span></label>
              <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Ej. nombre@email.com" required/>
            </div>
          </div>
          <div className="field-row">
            <div className="field">
              <label>Localidad <span style={{color:"var(--primary)"}}>*</span></label>
              <input type="text" value={city} onChange={(e) => setCity(e.target.value)} placeholder="Ej. Godoy Cruz, Mendoza" required/>
            </div>
            <div className="field">
              <label>Código postal</label>
              <input type="text" value={postalCode} onChange={(e) => setPostalCode(e.target.value)} placeholder="Ej. 5500"/>
            </div>
          </div>
          <div className="field-row">
            <div className="field">
              <label>Tipo de envío</label>
              <div style={{padding: "8px 12px", background: "var(--bg-2)", borderRadius: "var(--radius)", fontSize: 13, color: "var(--ink-2)", fontWeight: 500}}>
                {deliveryType === "local" ? "🏪 Retiro en local" : deliveryType === "domicilio" ? "🏠 A domicilio" : "📦 Retiro en sucursal Andreani"}
                {shippingCost > 0 ? ` — ${fmtPrice(shippingCost)}` : " — Gratis ✓"}
              </div>
            </div>
          </div>
          <div className="field">
            <label>Medio de contacto <span style={{color:"var(--primary)"}}>*</span></label>
            <div style={{display: "flex", gap: 8, marginBottom: 8, flexWrap: "wrap"}}>
              {["whatsapp","telefono","email","instagram"].map((t) => (
                <button key={t} onClick={() => setContactType(t)}
                  style={{padding: "5px 14px", borderRadius: 999, fontSize: 12, fontWeight: 600,
                    border: "1.5px solid " + (contactType === t ? "var(--primary)" : "var(--line-2)"),
                    background: contactType === t ? "var(--primary-soft)" : "transparent",
                    color: contactType === t ? "var(--primary)" : "var(--ink-3)",
                    cursor: "pointer", textTransform: "capitalize", letterSpacing: "0.04em"}}>
                  {{ whatsapp:"WhatsApp", telefono:"Teléfono", email:"Email", instagram:"Instagram" }[t]}
                </button>
              ))}
            </div>
            <input type={contactType === "email" ? "email" : "text"} value={contact}
              onChange={(e) => setContact(e.target.value)} placeholder={contactPlaceholder}/>
          </div>
          <div className="field">
            <label>Notas (opcional)</label>
            <textarea rows="2" value={notes} onChange={(e) => setNotes(e.target.value)} placeholder="Alergias, preferencias, horario de entrega…"></textarea>
          </div>
          <div className="field">
            <label>Vista previa del mensaje</label>
            <div className="wa-preview">{message}</div>
          </div>
        </div>
        <div className="modal-foot">
          <button className="btn-ghost" onClick={onClose}>Cancelar</button>
          <button className="btn-primary" style={{background: canSend ? "#25D366" : "var(--line)", cursor: canSend ? "pointer" : "not-allowed"}} onClick={send} disabled={!canSend} title={!canSend ? "Completá los campos obligatorios (*)" : ""}>
            <img src="assets/whatsapp-logo.png" alt="" style={{width:16,height:16,display:"block"}}/> Enviar por WhatsApp
          </button>
        </div>
      </div>
    </div>
  );
}

// =====================================================================
// FOOTER
// =====================================================================
function Footer({ store }) {
  const { config } = store;
  return (
    <footer className="footer">
      <div className="container">
        <div className="footer-grid">
          <div>
            <a href="#" aria-label="Somos Setas — Inicio" style={{display: "inline-block", marginBottom: 14}}>
              <img src="assets/logo-blanco.png" alt="Somos Setas" className="logo-img icon"/>
            </a>
            <p className="footer-tag">Hongos adaptógenos y suplementos naturales. La sabiduría de mil millones de años, en una gota.</p>
            <div style={{display: "flex", gap: 12, marginTop: 12}}>
              <a href={`https://instagram.com/${config.instagram}`} target="_blank" className="icon-btn" style={{background: "rgba(255,255,255,0.06)", color: "white"}}><Icon.insta width="16" height="16"/></a>
              <a href={`https://wa.me/${config.whatsapp}`} target="_blank" className="icon-btn" style={{background: "rgba(255,255,255,0.06)"}}><img src="assets/whatsapp-logo.png" alt="WhatsApp" style={{width:16,height:16,display:"block"}}/></a>
            </div>
          </div>
          <div>
            <h5>Catálogo</h5>
            <ul>
              {window.SS_CATEGORIES.map((c) => <li key={c.id}><a href={`#catalogo/${c.slug}`}>{c.name}</a></li>)}
            </ul>
          </div>
          <div>
            <h5>Ayuda</h5>
            <ul>
              <li><a href="#como-comprar">Cómo comprar</a></li>
              <li><a href="#filosofia">Filosofía</a></li>
              <li><a href={`https://wa.me/${config.whatsapp}`} target="_blank">Atención por WhatsApp</a></li>
              <li><a href="#admin">Panel admin</a></li>
            </ul>
          </div>
          <div>
            <h5>Contacto</h5>
            <ul>
              <li><Icon.pin width="14" height="14" style={{display: "inline", marginRight: 8, verticalAlign: "middle"}}/>{config.address}</li>
              <li><Icon.phone width="14" height="14" style={{display: "inline", marginRight: 8, verticalAlign: "middle"}}/>{config.whatsappDisplay}</li>
              <li><Icon.insta width="14" height="14" style={{display: "inline", marginRight: 8, verticalAlign: "middle"}}/>@{config.instagram}</li>
            </ul>
          </div>
        </div>
        <div className="footer-andreani">
          <img src="assets/andreani.png" alt="Andreani" className="footer-andreani-logo"/>
          <span>Envío garantizado</span>
        </div>
        <div className="footer-bottom">
          <span>© 2026 Somos Setas — Mendoza, Argentina</span>
          <span>Los productos no reemplazan tratamientos médicos. Consultá con un profesional.</span>
        </div>
      </div>
    </footer>
  );
}

// =====================================================================
// EXPORT TO WINDOW
// =====================================================================
Object.assign(window, {
  fmtPrice, slug, Icon, getPricingTier, parseVideoUrl,
  useLocalState, useHashRoute, useStore, navigate,
  Header, BannerCarousel, ProductCard, HomePage, CatalogPage,
  ProductDetailPage, CartDrawer, WhatsAppCheckout, SearchModal, Footer,
});
