/* BeautyBloom — Catálogo interactivo */

// ============ HERO ============
function Hero({ onScrollTo, productCount }) {
  const heroRef = useRef(null);
  const [parallax, setParallax] = useState(0);
  useEffect(() => {
    const onScroll = () => {
      const y = window.scrollY || 0;
      setParallax(Math.min(120, y * 0.25));
    };
    window.addEventListener("scroll", onScroll, { passive: true });
    return () => window.removeEventListener("scroll", onScroll);
  }, []);

  return (
    <section className="bb-hero" id="hero" ref={heroRef}>
      <div className="bb-hero-bg" style={{ transform: `translate3d(0, ${parallax * 0.3}px, 0)` }} aria-hidden="true">
        <svg viewBox="0 0 800 800" preserveAspectRatio="xMidYMid slice">
          <defs>
            <radialGradient id="bg-rad" cx="50%" cy="40%" r="60%">
              <stop offset="0%" stopColor="#E6EDD8" />
              <stop offset="100%" stopColor="#F5EFE3" />
            </radialGradient>
          </defs>
          <rect width="800" height="800" fill="url(#bg-rad)" />
          {/* hand-drawn centella leaves */}
          <g stroke="rgba(45,70,42,0.18)" fill="none" strokeWidth="0.8">
            <path d="M 100 600 Q 140 540 200 530 Q 260 520 290 560 Q 250 600 200 610 Q 140 620 100 600 Z" />
            <path d="M 130 590 Q 200 570 280 565" />
            <path d="M 600 200 Q 660 150 720 170 Q 740 240 700 270 Q 640 280 610 250 Q 590 220 600 200 Z" />
            <path d="M 620 220 Q 670 200 720 195" />
            <path d="M 480 660 Q 540 620 600 640 Q 600 700 540 710 Q 490 700 480 660 Z" />
          </g>
        </svg>
      </div>

      <div className="bb-hero-inner">
        <div className="bb-hero-left">
          <div className="bb-hero-stamp">
            <svg width="56" height="56" viewBox="0 0 56 56" aria-hidden="true">
              <circle cx="28" cy="28" r="26" fill="none" stroke="currentColor" strokeWidth="0.8" strokeDasharray="2 2" />
              <text fill="currentColor" fontSize="6" fontFamily="var(--font-mono)" textAnchor="middle">
                <textPath href="#circle-path" startOffset="0">
                  MADAGASCAR · CENTELLA · SKINCARE · 2026 ·
                </textPath>
              </text>
              <defs><path id="circle-path" d="M 28 28 m -19 0 a 19 19 0 1 1 38 0 a 19 19 0 1 1 -38 0" /></defs>
              <path d="M 20 28 Q 28 18 36 28 Q 28 38 20 28 Z" fill="currentColor" opacity="0.85" />
            </svg>
          </div>
          <span className="bb-eyebrow">2026 Product Catalog · Korean Skincare</span>
          <h1 className="bb-h1">
            La piel<br/>
            <em>calmada</em>,<br/>
            empieza con<br/>
            <span className="bb-h1-underline">Centella</span>.
          </h1>
          <p className="bb-lede">
            {productCount} productos formulados con Centella Asiática de Madagascar.
            Calma irritaciones, repara la barrera, hidrata profundamente y mejora el
            tono — paso a paso, como en Corea.
          </p>
          <div className="bb-hero-cta">
            <button className="bb-btn bb-btn--primary" onClick={() => onScrollTo("catalogo")}>
              Explorar catálogo
            </button>
            <button className="bb-btn bb-btn--ghost" onClick={() => onScrollTo("rutina")}>
              Construir mi rutina →
            </button>
          </div>
          <div className="bb-hero-stats">
            <div><b>100%</b><span>Centella de Madagascar</span></div>
            <div><b>5</b><span>pasos para piel perfecta</span></div>
            <div><b>15%</b><span>off por mes de las mamás</span></div>
          </div>
        </div>

        <div className="bb-hero-right">
          <FloatingBottles />
        </div>
      </div>

      <div className="bb-hero-promo" onClick={() => onScrollTo("catalogo")} role="button">
        <div className="bb-hero-promo-inner">
          <span className="bb-eyebrow">Consiente a mamá · hasta 15 may</span>
          <h3>15% OFF en todos los productos</h3>
          <span className="bb-link">Comprar ahora →</span>
        </div>
      </div>
    </section>
  );
}

// ---- Animated floating product silhouettes ----
function FloatingBottles() {
  const products = window.BB_DATA.products;
  const picks = useMemo(() => [
    products.find(p => p.sku === "BB-S-001"),
    products.find(p => p.sku === "BB-A-003"),
    products.find(p => p.sku === "BB-C-004"),
    products.find(p => p.sku === "BB-SP-001"),
  ].filter(Boolean), [products]);
  return (
    <div className="bb-float-stage">
      {picks.map((p, i) => (
        <div key={p.sku} className={`bb-float bb-float--${i}`} style={{ animationDelay: `${i * -9}s` }}>
          <ProductPlaceholder product={p} ratio="3 / 4" showSku={false} />
          <div className="bb-float-tag">
            <span className="bb-mono">{p.sku}</span>
            <b>{p.name}</b>
          </div>
        </div>
      ))}
      <div className="bb-float-ring" aria-hidden="true" />
    </div>
  );
}

// ============ ROUTINE STRIP ============
function RoutineStrip({ onPickStep }) {
  const [active, setActive] = useState(null);
  return (
    <section className="bb-routine" id="rutina">
      <div className="bb-section-head">
        <span className="bb-eyebrow">La rutina coreana en 5 pasos</span>
        <h2 className="bb-h2">Una rutina básica puede transformar tu piel.</h2>
        <p className="bb-lede">Toca cualquier paso para filtrar el catálogo por esa categoría.</p>
      </div>
      <div className="bb-routine-rail">
        {window.BB_DATA.routine.map((r, i) => (
          <button
            key={r.step}
            className="bb-routine-cell"
            data-active={active === i}
            onMouseEnter={() => setActive(i)}
            onMouseLeave={() => setActive(null)}
            onClick={() => onPickStep(r.cat)}
          >
            <div className="bb-routine-num-wrap">
              <span className="bb-routine-num">{r.step}</span>
              <span className="bb-routine-line" />
            </div>
            <h4>{r.name}</h4>
            <p>{r.desc}</p>
            <span className="bb-routine-cta">Ver productos →</span>
          </button>
        ))}
      </div>
    </section>
  );
}

// ============ INGREDIENT HIGHLIGHT ============
function IngredientPanel() {
  return (
    <section className="bb-science" id="ingredientes">
      <div className="bb-science-inner">
        <div className="bb-science-text">
          <span className="bb-eyebrow">Ingrediente estrella</span>
          <h2 className="bb-h2">Centella Asiática<br/>de Madagascar.</h2>
          <p className="bb-lede">
            Reconocida por sus propiedades calmantes y reparadoras. Ideal para piel
            sensible, acneica o dañada. Es la base de cada fórmula BeautyBloom.
          </p>
          <ul className="bb-science-list">
            <li><b>Calma</b> irritaciones y enrojecimiento</li>
            <li><b>Repara</b> la barrera cutánea</li>
            <li><b>Hidrata</b> profundamente</li>
            <li><b>Mejora</b> la textura y aporta brillo</li>
            <li><b>Suaviza</b> líneas de expresión</li>
          </ul>
        </div>
        <div className="bb-science-card">
          <img src="assets/centella-hero.png" alt="Hojas de Centella Asiática de Madagascar" className="bb-science-img" />
          <div className="bb-science-caption">
            <span className="bb-science-latin">Centella asiatica</span>
            <span className="bb-science-origin">Madagascar · Cosecha botánica</span>
          </div>
        </div>
      </div>
    </section>
  );
}

// ============ CATALOG ============
function Catalog({ query, setQuery, onOpenProduct, jumpToCategory, setJumpToCategory }) {
  const [cat, setCat] = useState("all");
  const [concerns, setConcerns] = useState([]);
  const [ingredient, setIngredient] = useState(null);
  const [priceRange, setPriceRange] = useState(null);
  const [sort, setSort] = useState("featured");
  const [showFilters, setShowFilters] = useState(true);

  // External jump (from routine strip)
  useEffect(() => {
    if (jumpToCategory) {
      setCat(jumpToCategory);
      setJumpToCategory(null);
    }
  }, [jumpToCategory]);

  const toggleConcern = (id) => {
    setConcerns(cs => cs.includes(id) ? cs.filter(c => c !== id) : [...cs, id]);
  };

  const priceRanges = useMemo(() => ([
    { id: "lte-400", label: "≤$400", match: (p) => p <= 400 },
    { id: "400-500", label: "$400–$500", match: (p) => p > 400 && p <= 500 },
    { id: "500-600", label: "$500–$600", match: (p) => p > 500 && p <= 600 },
    { id: "gt-600", label: ">$600", match: (p) => p > 600 },
  ]), []);

  const products = window.BB_DATA.products;

  const filtered = useMemo(() => {
    const q = query.trim().toLowerCase();
    let list = products.filter(p => {
      if (cat !== "all" && p.category !== cat) return false;
      if (concerns.length && !concerns.every(c => (p.concerns || []).includes(c))) return false;
      if (ingredient && !(p.ingredients || []).includes(ingredient)) return false;
      if (priceRange) {
        const selectedRange = priceRanges.find(range => range.id === priceRange);
        if (selectedRange && !selectedRange.match(p.price)) return false;
      }
      if (q) {
        const haystack = [p.name, p.tagline, p.desc, p.sku, ...(p.ingredients || []), ...(p.concerns || [])]
          .join(" ").toLowerCase();
        if (!haystack.includes(q)) return false;
      }
      return true;
    });
    if (sort === "price-asc")  list = [...list].sort((a, b) => a.price - b.price);
    if (sort === "price-desc") list = [...list].sort((a, b) => b.price - a.price);
    if (sort === "new")        list = [...list].sort((a, b) => (b.isNew ? 1 : 0) - (a.isNew ? 1 : 0));
    if (sort === "featured")   list = [...list].sort((a, b) => (b.bestseller ? 2 : 0) + (b.featured ? 1 : 0) - ((a.bestseller ? 2 : 0) + (a.featured ? 1 : 0)));
    return list;
  }, [cat, concerns, ingredient, priceRange, priceRanges, query, sort, products]);

  const counts = useMemo(() => {
    const m = { all: products.length };
    products.forEach(p => { m[p.category] = (m[p.category] || 0) + 1; });
    return m;
  }, [products]);

  const clearAll = () => { setQuery(""); setCat("all"); setConcerns([]); setIngredient(null); setPriceRange(null); };
  const activeFilterCount = (cat !== "all" ? 1 : 0) + concerns.length + (ingredient ? 1 : 0) + (priceRange ? 1 : 0) + (query ? 1 : 0);

  return (
    <section className="bb-catalog" id="catalogo">
      <div className="bb-section-head bb-section-head--row">
        <div>
          <span className="bb-eyebrow">2026 Product Catalog</span>
          <h2 className="bb-h2">Catálogo completo</h2>
          <p className="bb-lede">
            <span className="bb-count" key={filtered.length}>{filtered.length}</span> de {products.length} productos
            {activeFilterCount > 0 && <button className="bb-link bb-link--clear" onClick={clearAll}>· Limpiar filtros</button>}
          </p>
        </div>
        <div className="bb-shop-tools">
          <div className="bb-search-big">
            <svg width="18" height="18" viewBox="0 0 20 20" fill="none"><circle cx="9" cy="9" r="6" stroke="currentColor" strokeWidth="1.4"/><path d="m14 14 4 4" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round"/></svg>
            <input value={query} onChange={(e) => setQuery(e.target.value)} placeholder="Busca por nombre, ingrediente, beneficio…" />
            {query && <button onClick={() => setQuery("")} aria-label="Borrar">×</button>}
          </div>
          <label className="bb-sort">
            <span>Ordenar</span>
            <select value={sort} onChange={(e) => setSort(e.target.value)}>
              <option value="featured">Destacados</option>
              <option value="new">Más nuevos</option>
              <option value="price-asc">Precio · menor a mayor</option>
              <option value="price-desc">Precio · mayor a menor</option>
            </select>
          </label>
        </div>
      </div>

      {/* Category tabs (horizontal scroll) */}
      <div className="bb-cat-rail" role="tablist">
        {window.BB_DATA.categories.map(c => (
          <button
            key={c.id}
            className="bb-cat-pill"
            data-active={cat === c.id}
            onClick={() => setCat(c.id)}
          >
            <span>{c.label}</span>
            <span className="bb-cat-pill-count">{counts[c.id] ?? counts.all}</span>
          </button>
        ))}
      </div>

      <div className="bb-shop-body">
        <aside className="bb-filters" data-open={showFilters}>
          <div className="bb-filter-head">
            <h5>Filtros</h5>
            <button className="bb-link" onClick={() => setShowFilters(!showFilters)}>{showFilters ? "Ocultar" : "Mostrar"}</button>
          </div>
          <div className="bb-filter-group">
            <h6>Necesidad de la piel</h6>
            <div className="bb-chip-wrap">
              {window.BB_DATA.concerns.map(c => (
                <button
                  key={c.id}
                  className="bb-chip"
                  data-active={concerns.includes(c.id)}
                  onClick={() => toggleConcern(c.id)}
                >{c.label}</button>
              ))}
            </div>
          </div>
          <div className="bb-filter-group">
            <h6>Ingrediente activo</h6>
            <div className="bb-chip-wrap">
              {window.BB_DATA.ingredients.map(ing => (
                <button
                  key={ing}
                  className="bb-chip bb-chip--ing"
                  data-active={ingredient === ing}
                  onClick={() => setIngredient(ingredient === ing ? null : ing)}
                >{ing}</button>
              ))}
            </div>
          </div>
          <div className="bb-filter-group">
            <h6>Rango de precio</h6>
            <div className="bb-price-strip">
              {priceRanges.map((range) => {
                const n = products.filter(p => range.match(p.price)).length;
                return (
                  <button
                    key={range.id}
                    className="bb-chip bb-chip--price"
                    data-active={priceRange === range.id}
                    onClick={() => setPriceRange(priceRange === range.id ? null : range.id)}
                  >
                    {range.label} · {n}
                  </button>
                );
              })}
            </div>
          </div>
          <div className="bb-filter-cta">
            <div className="bb-filter-stats">
              <b>{filtered.length}</b><span>resultados</span>
            </div>
            <button className="bb-link" onClick={clearAll}>Limpiar todo</button>
          </div>
        </aside>

        <div className="bb-shop-main">
          {filtered.length === 0 ? (
            <div className="bb-empty-state">
              <h4>Sin resultados</h4>
              <p>Probá quitar algunos filtros o cambiá la búsqueda.</p>
              <button className="bb-btn bb-btn--ghost" onClick={clearAll}>Limpiar filtros</button>
            </div>
          ) : (
            <div className="bb-grid">
              {filtered.map((p, i) => (
                <article
                  key={p.sku}
                  className="bb-card"
                  style={{ animationDelay: `${Math.min(i, 12) * 0.04}s` }}
                  onClick={() => onOpenProduct(p)}
                >
                  <div className="bb-card-media">
                    <ProductPlaceholder product={p} />
                    <div className="bb-card-tags">
                      {p.isNew && <span className="bb-tag bb-tag--new">Nuevo</span>}
                      {p.bestseller && <span className="bb-tag bb-tag--best">Bestseller</span>}
                      {p.featured && !p.bestseller && <span className="bb-tag">Destacado</span>}
                    </div>
                    <span className="bb-card-step">{p.step ? `Paso ${String(p.step).padStart(2,"0")}` : "Especial"}</span>
                    <button
                      className="bb-card-peek"
                      onClick={(e) => { e.stopPropagation(); onOpenProduct(p); }}
                      aria-label={`Ver ${p.name}`}
                    >
                      <span>Ver detalle</span>
                      <svg width="14" height="14" viewBox="0 0 16 16"><path d="M3 8h10m-4-4 4 4-4 4" stroke="currentColor" strokeWidth="1.4" fill="none" strokeLinecap="round" strokeLinejoin="round"/></svg>
                    </button>
                  </div>
                  <div className="bb-card-body">
                    <div className="bb-card-meta">
                      <span className="bb-card-sku">{p.sku}</span>
                      <span className="bb-card-size">{p.size}</span>
                    </div>
                    <h3 className="bb-card-name">{p.name}</h3>
                    <p className="bb-card-tag">{p.tagline}</p>
                    <div className="bb-card-foot">
                      <span className="bb-card-price">{formatMXN(p.price)}</span>
                      <span className="bb-card-ing">
                        {(p.ingredients || []).slice(0, 2).map(ing => <em key={ing}>{ing}</em>)}
                      </span>
                    </div>
                  </div>
                </article>
              ))}
            </div>
          )}
        </div>
      </div>
    </section>
  );
}

// ============ QUICK VIEW MODAL ============
function QuickView({ product, onClose }) {
  const [tab, setTab] = useState("desc");
  const [activeImg, setActiveImg] = useState(0);

  useEffect(() => {
    if (!product) return;
    setActiveImg(product.coverIndex ?? 0);
    document.body.style.overflow = "hidden";
    const onKey = (e) => e.key === "Escape" && onClose();
    window.addEventListener("keydown", onKey);
    return () => { document.body.style.overflow = ""; window.removeEventListener("keydown", onKey); };
  }, [product]);
  if (!product) return null;

  // Build image list: prefer images[] array, fall back to hero filename
  const imgList = (() => {
    if (product.images && product.images.length > 0) return product.images;
    if (product.hero) return [`products/${product.hero}.jpg`];
    return [];
  })();

  const related = (() => {
    const bySku = (product.relatedSkus || [])
      .map(sku => window.BB_DATA.products.find(p => p.sku === sku))
      .filter(Boolean)
      .filter(p => p.sku !== product.sku);
    if (bySku.length > 0) return bySku.slice(0, 3);
    return window.BB_DATA.products
      .filter(p => p.category === product.category && p.sku !== product.sku)
      .slice(0, 3);
  })();

  return (
    <div className="bb-modal-scrim" onClick={onClose}>
      <div className="bb-modal" onClick={(e) => e.stopPropagation()} role="dialog" aria-modal="true">
        <button className="bb-modal-close" onClick={onClose} aria-label="Cerrar">✕</button>
        <div className="bb-modal-grid">
          <div className="bb-modal-media">
            {/* Main image */}
            {imgList.length > 0 ? (
              <div style={{ aspectRatio: "1/1", background: `${product.swatch}22`, borderRadius: 8, overflow: "hidden", position: "relative" }}>
                <img
                  src={imgList[activeImg] || imgList[0]}
                  alt={product.name}
                  style={{ width: "100%", height: "100%", objectFit: "cover", display: "block" }}
                  onError={(e) => { e.currentTarget.style.display = "none"; }}
                />
              </div>
            ) : (
              <ProductPlaceholder product={product} ratio="1 / 1" />
            )}

            {/* Thumbnails — only shown when multiple images */}
            {imgList.length > 1 && (
              <div className="bb-modal-thumbs">
                {imgList.map((src, i) => (
                  <button
                    key={i}
                    className="bb-modal-thumb"
                    data-active={i === activeImg}
                    onClick={() => setActiveImg(i)}
                    style={{ border: "none", padding: 0, cursor: "pointer", borderRadius: 4, overflow: "hidden" }}
                    aria-label={`Ver foto ${i + 1}`}
                  >
                    <img src={src} alt={`${product.name} ${i + 1}`} style={{ width: "100%", height: "100%", objectFit: "cover", display: "block", aspectRatio: "1/1" }}
                      onError={(e) => { e.currentTarget.style.display = "none"; }} />
                  </button>
                ))}
              </div>
            )}
          </div>
          <div className="bb-modal-info">
            <span className="bb-eyebrow">{product.step ? `Paso 0${product.step}` : "Especial"} · {product.tagline}</span>
            <h2 className="bb-h2">{product.name}</h2>
            <div className="bb-pdp-meta">
              <span className="bb-mono">{product.sku}</span>
              <span>·</span>
              <span>{product.size}</span>
            </div>
            <div className="bb-pdp-price">
              <span className="bb-price-now">{formatMXN(product.price)}</span>
              <span className="bb-price-promo">15% OFF · {formatMXN(Math.round(product.price * 0.85))} con cupón MAMÁ</span>
            </div>

            <div className="bb-pdp-tabs">
              {[
                ["desc", "Descripción"],
                ["ing", "Activos"],
                ["uso", "Cómo usar"],
              ].map(([id, label]) => (
                <button key={id} data-active={tab === id} onClick={() => setTab(id)}>{label}</button>
              ))}
            </div>
            <div className="bb-pdp-tab-body">
              {tab === "desc" && <p>{product.desc}</p>}
              {tab === "ing" && (
                <div className="bb-ing-list">
                  {(product.ingredients || []).map(ing => <span key={ing} className="bb-chip bb-chip--ing" data-active="true">{ing}</span>)}
                  <p className="bb-mute">
                    Para piel: {(product.concerns || []).map(c =>
                      window.BB_DATA.concerns.find(cc => cc.id === c)?.label
                    ).filter(Boolean).join(" · ")}
                  </p>
                </div>
              )}
              {tab === "uso" && (
                <ol className="bb-howto">
                  <li>Aplica sobre piel limpia y seca (paso {product.step || "—"}).</li>
                  <li>Toma 2–3 gotas/dispensaciones y reparte por el rostro.</li>
                  <li>Da palmaditas suaves hasta absorber.</li>
                  <li>Continúa con el siguiente paso de tu rutina.</li>
                  <li>De día, finaliza siempre con protector solar.</li>
                </ol>
              )}
            </div>

            <div className="bb-modal-cta">
              <a className="bb-btn bb-btn--primary" href="tel:4494685174">
                <svg width="16" height="16" viewBox="0 0 20 20" fill="none" style={{ marginRight: 8 }}><path d="M5 3.5 7 3l2 4-2 1.5a10 10 0 0 0 4.5 4.5L13 11l4 2-.5 2A2 2 0 0 1 14.4 17 12 12 0 0 1 3 5.6 2 2 0 0 1 5 3.5Z" stroke="currentColor" strokeWidth="1.4" strokeLinejoin="round"/></svg>
                Llamar para pedido
              </a>
              <a className="bb-btn bb-btn--ghost" href={`https://wa.me/524494685174?text=Hola%2C%20me%20interesa%20${encodeURIComponent(product.name)}%20(${product.sku})`} target="_blank" rel="noopener">
                WhatsApp
              </a>
            </div>

            <p className="bb-mute bb-mute--small">
              Envíos a todo México desde Aguascalientes · contacto@beautybloom.com.mx
            </p>

            {related.length > 0 && (
              <div className="bb-related">
                <h6>Combina con</h6>
                <div className="bb-related-row">
                  {related.map(r => (
                    <button key={r.sku} className="bb-related-card" onClick={() => { window.scrollTo({ top: 0, behavior: "instant" }); }}>
                      <div className="bb-related-thumb"><ProductPlaceholder product={r} ratio="1 / 1" showSku={false} /></div>
                      <div>
                        <b>{r.name}</b>
                        <span>{formatMXN(r.price)}</span>
                      </div>
                    </button>
                  ))}
                </div>
              </div>
            )}
          </div>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { Hero, RoutineStrip, IngredientPanel, Catalog, QuickView });
