// ---- SÉRÈNE — pages : Accueil, Catégorie, Fiche produit ---------------

/* =================== HOME =================== */
function HomePage({ go, addToCart }) {
  return (
    <div className="page-fade">
      {/* Hero */}
      <section style={{ position: "relative" }}>
        <Ph label="intérieur lifestyle — bannière" tone="sage" ratio="auto"
            style={{ minHeight: "78vh", borderRadius: 0 }} />
        <div style={{
          position: "absolute", inset: 0, display: "flex", flexDirection: "column",
          justifyContent: "center", padding: "0 8vw",
          background: "linear-gradient(90deg, oklch(0.97 0.01 85 / 0.66) 0%, oklch(0.97 0.01 85 / 0.12) 55%, transparent 100%)",
        }}>
          <div className="eyebrow" style={{ marginBottom: 22 }}>Collection Printemps · 2026</div>
          <h1 style={{ fontSize: "clamp(46px, 7vw, 92px)", maxWidth: 760, fontWeight: 500 }}>
            La maison,<br /><span style={{ fontStyle: "italic", color: "var(--sage-deep)" }}>posément</span> habitée.
          </h1>
          <p style={{ maxWidth: 420, marginTop: 24, fontSize: 17, color: "var(--ink-soft)", lineHeight: 1.6 }}>
            Des objets tournés, tissés et soufflés main. Choisis pour durer, pensés pour apaiser le quotidien.
          </p>
          <div style={{ display: "flex", gap: 16, marginTop: 38, flexWrap: "wrap" }}>
            <button className="btn" onClick={() => go("category", { cat: "ceramique" })}>Découvrir la collection</button>
            <button className="btn btn--ghost" onClick={() => go("category", { cat: "luminaires" })}>Les luminaires</button>
          </div>
        </div>
      </section>

      {/* Categories */}
      <section className="container" style={{ padding: "100px 36px 30px" }}>
        <SectionHead eyebrow="Par univers" title="Explorer la maison" />
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: 20 }}>
          {CATEGORIES.map((c) => (
            <button key={c.id} onClick={() => go("category", { cat: c.id })}
              style={{ background: "none", border: "none", padding: 0, textAlign: "left", cursor: "pointer" }}>
              <div style={{ overflow: "hidden", borderRadius: "var(--radius-lg)" }}>
                <Ph label={c.name.toLowerCase()} tone={c.tone} ratio="3 / 4" />
              </div>
              <h3 style={{ fontSize: 23, marginTop: 16 }}>{c.name}</h3>
              <p style={{ fontSize: 13, color: "var(--ink-faint)", marginTop: 4 }}>{c.blurb}</p>
            </button>
          ))}
        </div>
      </section>

      {/* Featured products */}
      <section className="container" style={{ padding: "80px 36px" }}>
        <SectionHead eyebrow="Sélection" title="Pièces du moment"
          action="Tout voir" onAction={() => go("category", { cat: "all" })} />
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(250px, 1fr))", gap: "44px 28px" }}>
          {PRODUCTS.slice(0, 4).map((p) => (
            <ProductCard key={p.id} p={p} onOpen={(id) => go("product", { id })} onAdd={addToCart} />
          ))}
        </div>
      </section>

      {/* Editorial band */}
      <section style={{ background: "var(--cream-deep)", marginTop: 20 }}>
        <div className="container edito-grid" style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 0, alignItems: "stretch", padding: 0 }}>
          <Ph label="atelier — savoir-faire" tone="clay" ratio="auto" style={{ minHeight: 520, borderRadius: 0 }} />
          <div style={{ padding: "clamp(40px, 6vw, 90px)", display: "flex", flexDirection: "column", justifyContent: "center" }}>
            <div className="eyebrow" style={{ marginBottom: 20 }}>Notre fabrique</div>
            <h2 style={{ fontSize: "clamp(30px, 4vw, 48px)", maxWidth: 460 }}>Le temps comme matière première.</h2>
            <p style={{ marginTop: 22, fontSize: 16, color: "var(--ink-soft)", lineHeight: 1.7, maxWidth: 440 }}>
              Chaque pièce naît d'un geste lent — celui d'artisans qui prennent le temps. Nous travaillons en petites séries, avec des matières nobles et des ateliers que nous connaissons par leur prénom.
            </p>
            <div style={{ marginTop: 34 }}>
              <button className="btn btn--ghost" onClick={() => go("category", { cat: "all" })}>Découvrir l'histoire</button>
            </div>
          </div>
        </div>
      </section>

      {/* Values */}
      <section className="container" style={{ padding: "84px 36px" }}>
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(230px, 1fr))", gap: 30 }}>
          {[
            [<IconLeaf size={26} sw={1.2} />, "Matières durables", "Lin, laine, grès et verre, sourcés en Europe."],
            [<IconTruck size={26} sw={1.2} />, "Livraison soignée", "Offerte dès 120 € · emballage zéro plastique."],
            [<IconGift size={26} sw={1.2} />, "Emballage cadeau", "Furoshiki en lin sur demande, gratuit."],
          ].map(([ic, t, d], i) => (
            <div key={i} style={{ display: "flex", gap: 16, alignItems: "flex-start" }}>
              <span style={{ color: "var(--sage-deep)", flexShrink: 0, marginTop: 2 }}>{ic}</span>
              <div>
                <h4 style={{ fontFamily: "var(--font-ui)", fontWeight: 500, fontSize: 15, letterSpacing: "0.02em" }}>{t}</h4>
                <p style={{ fontSize: 13.5, color: "var(--ink-faint)", marginTop: 6, lineHeight: 1.6 }}>{d}</p>
              </div>
            </div>
          ))}
        </div>
      </section>

      <Newsletter />
    </div>
  );
}

/* =================== CATEGORY =================== */
function CategoryPage({ params, go, addToCart }) {
  const all = params.cat === "all";
  const cat = CATEGORIES.find((c) => c.id === params.cat);
  const base = all ? PRODUCTS : productsByCat(params.cat);

  const [sort, setSort] = useState("featured");
  const [activeCat, setActiveCat] = useState(params.cat);
  const [maxPrice, setMaxPrice] = useState(260);

  useEffect(() => { setActiveCat(params.cat); }, [params.cat]);

  let list = (activeCat === "all" ? PRODUCTS : productsByCat(activeCat)).filter((p) => p.price <= maxPrice);
  if (sort === "low") list = [...list].sort((a, b) => a.price - b.price);
  if (sort === "high") list = [...list].sort((a, b) => b.price - a.price);

  return (
    <div className="page-fade">
      {/* Header band */}
      <div style={{ background: "var(--cream-deep)", padding: "44px 0 48px", borderBottom: "1px solid var(--line-soft)" }}>
        <div className="container">
          <div style={{ fontSize: 12, letterSpacing: "0.1em", color: "var(--ink-faint)", marginBottom: 18 }}>
            <button onClick={() => go("home")} style={{ background: "none", border: "none", color: "inherit", cursor: "pointer", padding: 0 }}>Accueil</button>
            <span style={{ margin: "0 8px" }}>/</span>
            {all ? "Boutique" : cat?.name}
          </div>
          <h1 style={{ fontSize: "clamp(38px, 6vw, 66px)" }}>{all ? "Toute la boutique" : cat?.name}</h1>
          <p style={{ marginTop: 12, color: "var(--ink-soft)", maxWidth: 460, fontSize: 15.5 }}>
            {all ? "L'intégralité de nos pièces, du grès tourné au verre soufflé." : cat?.blurb}
          </p>
        </div>
      </div>

      <div className="container" style={{ display: "grid", gridTemplateColumns: "230px 1fr", gap: 48, padding: "44px 36px 90px", alignItems: "start" }}>
        {/* Filters */}
        <aside className="hide-mobile" style={{ position: "sticky", top: 96 }}>
          <FilterGroup title="Univers">
            <FilterLink active={activeCat === "all"} onClick={() => setActiveCat("all")} label="Tout" count={PRODUCTS.length} />
            {CATEGORIES.map((c) => (
              <FilterLink key={c.id} active={activeCat === c.id} onClick={() => setActiveCat(c.id)}
                label={c.name} count={productsByCat(c.id).length} />
            ))}
          </FilterGroup>
          <FilterGroup title="Prix maximum">
            <input type="range" min="38" max="260" value={maxPrice} onChange={(e) => setMaxPrice(+e.target.value)}
              style={{ width: "100%", accentColor: "var(--sage-deep)" }} />
            <div style={{ fontSize: 13, color: "var(--ink-soft)", marginTop: 8 }}>Jusqu'à {fmt(maxPrice)}</div>
          </FilterGroup>
        </aside>

        {/* Grid */}
        <div>
          <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 28, flexWrap: "wrap", gap: 12 }}>
            <span style={{ fontSize: 13, color: "var(--ink-faint)", letterSpacing: "0.04em" }}>{list.length} pièce{list.length > 1 ? "s" : ""}</span>
            <label style={{ fontSize: 13, color: "var(--ink-soft)", display: "flex", alignItems: "center", gap: 10 }}>
              Trier
              <select value={sort} onChange={(e) => setSort(e.target.value)}
                style={{ fontFamily: "var(--font-ui)", fontSize: 13, padding: "8px 12px", border: "1px solid var(--line)", borderRadius: "var(--radius)", background: "var(--paper)", color: "var(--ink)" }}>
                <option value="featured">Sélection</option>
                <option value="low">Prix croissant</option>
                <option value="high">Prix décroissant</option>
              </select>
            </label>
          </div>
          {list.length === 0 ? (
            <p style={{ color: "var(--ink-faint)", padding: "60px 0" }}>Aucune pièce sous ce prix. Augmente le curseur.</p>
          ) : (
            <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(230px, 1fr))", gap: "44px 26px" }}>
              {list.map((p) => (
                <ProductCard key={p.id} p={p} onOpen={(id) => go("product", { id })} onAdd={addToCart} />
              ))}
            </div>
          )}
        </div>
      </div>
    </div>
  );
}

const FilterGroup = ({ title, children }) => (
  <div style={{ marginBottom: 34 }}>
    <h4 style={{ fontFamily: "var(--font-ui)", fontWeight: 500, fontSize: 12, letterSpacing: "0.18em", textTransform: "uppercase", color: "var(--ink)", marginBottom: 16 }}>{title}</h4>
    <div style={{ display: "flex", flexDirection: "column", gap: 11 }}>{children}</div>
  </div>
);
const FilterLink = ({ active, onClick, label, count }) => (
  <button onClick={onClick} style={{
    background: "none", border: "none", padding: 0, cursor: "pointer", textAlign: "left",
    display: "flex", justifyContent: "space-between", fontSize: 14.5,
    color: active ? "var(--ink)" : "var(--ink-soft)", fontWeight: active ? 500 : 300,
  }}>
    <span style={{ borderBottom: active ? "1px solid var(--ink)" : "1px solid transparent", paddingBottom: 1 }}>{label}</span>
    <span style={{ color: "var(--ink-faint)", fontSize: 12 }}>{count}</span>
  </button>
);

/* =================== PRODUCT =================== */
function ProductPage({ params, go, addToCart }) {
  const p = productById(params.id) || PRODUCTS[0];
  const [color, setColor] = useState(0);
  const [qty, setQty] = useState(1);
  const [activeImg, setActiveImg] = useState(0);
  const [openAcc, setOpenAcc] = useState("details");
  const [added, setAdded] = useState(false);
  const related = PRODUCTS.filter((x) => x.cat === p.cat && x.id !== p.id).concat(PRODUCTS.filter((x) => x.cat !== p.cat)).slice(0, 4);

  useEffect(() => { setColor(0); setQty(1); setActiveImg(0); setAdded(false); window.scrollTo(0, 0); }, [params.id]);

  const doAdd = () => { addToCart(p, qty, p.colors[color][0]); setAdded(true); setTimeout(() => setAdded(false), 2200); };
  const views = ["produit", "détail", "en situation"];

  return (
    <div className="page-fade container" style={{ padding: "30px 36px 90px" }}>
      <div style={{ fontSize: 12, letterSpacing: "0.08em", color: "var(--ink-faint)", marginBottom: 30 }}>
        <button onClick={() => go("home")} style={{ background: "none", border: "none", color: "inherit", cursor: "pointer", padding: 0 }}>Accueil</button>
        <span style={{ margin: "0 8px" }}>/</span>
        <button onClick={() => go("category", { cat: p.cat })} style={{ background: "none", border: "none", color: "inherit", cursor: "pointer", padding: 0 }}>{p.catName}</button>
        <span style={{ margin: "0 8px" }}>/</span>
        <span style={{ color: "var(--ink-soft)" }}>{p.name}</span>
      </div>

      <div style={{ display: "grid", gridTemplateColumns: "1.15fr 1fr", gap: 64, alignItems: "start" }} className="pdp-grid">
        {/* Gallery */}
        <div style={{ display: "grid", gridTemplateColumns: "70px 1fr", gap: 16 }} className="pdp-gallery">
          <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
            {views.map((v, i) => (
              <button key={i} onClick={() => setActiveImg(i)} style={{ padding: 0, border: activeImg === i ? "1px solid var(--ink)" : "1px solid var(--line)", borderRadius: "var(--radius)", overflow: "hidden", cursor: "pointer", background: "none" }}>
                <Ph label="" tone={p.tone} ratio="1 / 1" />
              </button>
            ))}
          </div>
          <Ph label={p.name.toLowerCase() + " — " + views[activeImg]} tone={p.tone} ratio="4 / 5" style={{ borderRadius: "var(--radius-lg)" }} />
        </div>

        {/* Info */}
        <div style={{ position: "sticky", top: 96 }}>
          {p.tag && <div className="eyebrow" style={{ color: "var(--sage-deep)", marginBottom: 14 }}>{p.tag}</div>}
          <h1 style={{ fontSize: "clamp(34px, 4.5vw, 52px)" }}>{p.name}</h1>
          <div style={{ fontSize: 22, marginTop: 16, fontVariantNumeric: "tabular-nums" }}>{fmt(p.price)}</div>
          <p style={{ marginTop: 22, fontSize: 16, color: "var(--ink-soft)", lineHeight: 1.7 }}>{p.desc}</p>

          {/* Colors */}
          <div style={{ marginTop: 32 }}>
            <div style={{ fontSize: 12, letterSpacing: "0.1em", textTransform: "uppercase", color: "var(--ink-faint)", marginBottom: 13 }}>
              Coloris — <span style={{ color: "var(--ink)" }}>{p.colors[color][0]}</span>
            </div>
            <div style={{ display: "flex", gap: 12 }}>
              {p.colors.map((c, i) => (
                <Swatch key={i} tone={c[1]} active={color === i} onClick={() => setColor(i)} title={c[0]} />
              ))}
            </div>
          </div>

          {/* Qty + add */}
          <div style={{ display: "flex", gap: 14, marginTop: 34, alignItems: "stretch" }}>
            <Stepper value={qty} onChange={setQty} />
            <button className="btn" style={{ flex: 1, background: added ? "var(--sage-deep)" : "var(--ink)", borderColor: added ? "var(--sage-deep)" : "var(--ink)", color: "var(--cream)", display: "flex", alignItems: "center", justifyContent: "center", gap: 10 }}
              onClick={doAdd}>
              {added ? <><IconCheck size={16} /> Ajouté</> : "Ajouter au panier · " + fmt(p.price * qty)}
            </button>
          </div>
          <div style={{ display: "flex", alignItems: "center", gap: 9, marginTop: 18, fontSize: 13, color: "var(--ink-faint)" }}>
            <IconTruck size={17} sw={1.3} /> Expédié sous 48 h · livraison offerte dès 120 €
          </div>

          {/* Accordions */}
          <div style={{ marginTop: 38, borderTop: "1px solid var(--line)" }}>
            <Accordion id="details" open={openAcc} setOpen={setOpenAcc} title="Caractéristiques">
              <dl style={{ margin: 0, display: "grid", gridTemplateColumns: "auto 1fr", gap: "10px 24px" }}>
                {Object.entries(p.details).map(([k, v]) => (
                  <React.Fragment key={k}>
                    <dt style={{ color: "var(--ink-faint)", fontSize: 13.5 }}>{k}</dt>
                    <dd style={{ margin: 0, fontSize: 13.5 }}>{v}</dd>
                  </React.Fragment>
                ))}
              </dl>
            </Accordion>
            <Accordion id="ship" open={openAcc} setOpen={setOpenAcc} title="Livraison & retours">
              <p style={{ margin: 0, fontSize: 14, color: "var(--ink-soft)", lineHeight: 1.7 }}>
                Expédition soignée sous 48 h ouvrées. Livraison offerte dès 120 € d'achat. Retours acceptés sous 30 jours, dans leur emballage d'origine.
              </p>
            </Accordion>
            <Accordion id="care" open={openAcc} setOpen={setOpenAcc} title="Entretien">
              <p style={{ margin: 0, fontSize: 14, color: "var(--ink-soft)", lineHeight: 1.7 }}>
                Pièce fabriquée à la main : de légères variations sont normales et garantissent l'unicité. Voir les recommandations propres à la matière ci-dessus.
              </p>
            </Accordion>
          </div>
        </div>
      </div>

      {/* Related */}
      <section style={{ marginTop: 100 }}>
        <SectionHead eyebrow="À compléter" title="Dans le même esprit" />
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(230px, 1fr))", gap: "44px 26px" }}>
          {related.map((rp) => (
            <ProductCard key={rp.id} p={rp} onOpen={(id) => go("product", { id })} onAdd={addToCart} />
          ))}
        </div>
      </section>
    </div>
  );
}

const Accordion = ({ id, open, setOpen, title, children }) => {
  const isOpen = open === id;
  return (
    <div style={{ borderBottom: "1px solid var(--line)" }}>
      <button onClick={() => setOpen(isOpen ? "" : id)}
        style={{ width: "100%", background: "none", border: "none", padding: "18px 0", display: "flex", justifyContent: "space-between", alignItems: "center", cursor: "pointer", color: "var(--ink)" }}>
        <span style={{ fontSize: 13, letterSpacing: "0.12em", textTransform: "uppercase" }}>{title}</span>
        <span style={{ transform: isOpen ? "rotate(45deg)" : "none", transition: "transform 0.3s var(--ease)" }}><IconPlus size={16} /></span>
      </button>
      <div style={{ maxHeight: isOpen ? 400 : 0, overflow: "hidden", transition: "max-height 0.4s var(--ease), padding 0.3s" }}>
        <div style={{ paddingBottom: isOpen ? 22 : 0 }}>{children}</div>
      </div>
    </div>
  );
};

/* =================== Newsletter (shared) =================== */
function Newsletter() {
  const [sent, setSent] = useState(false);
  return (
    <section style={{ background: "var(--ink)", color: "var(--cream)" }}>
      <div className="container" style={{ padding: "84px 36px", textAlign: "center" }}>
        <div className="eyebrow" style={{ color: "oklch(0.75 0.02 80)", marginBottom: 18 }}>La lettre SÉRÈNE</div>
        <h2 style={{ fontSize: "clamp(30px, 4vw, 46px)", color: "var(--cream)", maxWidth: 600, margin: "0 auto" }}>
          Le calme, une fois par mois.
        </h2>
        <p style={{ maxWidth: 440, margin: "18px auto 0", color: "oklch(0.82 0.015 80)", fontSize: 15 }}>
          Nouvelles pièces, coulisses d'atelier et rituels de saison. Rien de plus.
        </p>
        <form onSubmit={(e) => { e.preventDefault(); setSent(true); }}
          style={{ display: "flex", gap: 10, maxWidth: 440, margin: "34px auto 0", flexWrap: "wrap", justifyContent: "center" }}>
          {sent ? (
            <div style={{ display: "flex", alignItems: "center", gap: 10, color: "var(--cream)", fontSize: 15 }}><IconCheck size={18} /> Merci — à très vite.</div>
          ) : (
            <>
              <input required type="email" placeholder="votre@email.fr"
                style={{ flex: 1, minWidth: 220, background: "transparent", border: "1px solid oklch(0.5 0.01 80)", borderRadius: "var(--radius)", padding: "14px 18px", color: "var(--cream)", fontFamily: "var(--font-ui)", fontSize: 14 }} />
              <button className="btn" style={{ background: "var(--cream)", color: "var(--ink)", borderColor: "var(--cream)" }}>S'inscrire</button>
            </>
          )}
        </form>
      </div>
    </section>
  );
}

Object.assign(window, { HomePage, CategoryPage, ProductPage, Newsletter, Accordion, FilterGroup, FilterLink });
