/* SMILE ROOM — Web UI kit · tienda (ecommerce)
 * Catálogo (servicios · packs · productos), carrito deslizante y checkout.
 * Consume los tokens (styles.css) y los componentes de parts.jsx.
 * Producto estrella: Blanqueamiento POLUS (Ultrasonido + LED + Halógena).
 * NOTA: los precios son marcadores de posición — ajústalos en CATALOG.
 */
const { KBtn, Eyebrow, Rule, SectionHeading, Reveal, useViewport } = window;

/* ---- estilos propios de la tienda (badge pulse + slide del carrito) ---- */
const ensureShopStyle = () => {
  if (typeof document === 'undefined' || document.getElementById('sr-shop-style')) return;
  const el = document.createElement('style');
  el.id = 'sr-shop-style';
  el.textContent = `
  @keyframes sr-badgepop{0%{transform:scale(.4);opacity:0}55%{transform:scale(1.25)}100%{transform:scale(1);opacity:1}}
  @keyframes sr-toastin{0%{transform:translateY(20px);opacity:0}100%{transform:translateY(0);opacity:1}}
  .sr-cart-badge{animation:sr-badgepop .42s var(--ease-out)}
  .sr-toast{animation:sr-toastin .4s var(--ease-out)}
  .sr-drawer-scrim{transition:opacity .35s var(--ease-out)}
  .sr-drawer-panel{transition:transform .42s var(--ease-out)}`;
  document.head.appendChild(el);
};

const MXN = n => '$' + Number(n).toLocaleString('es-MX') + ' MXN';

/* ---------------------------------- CATÁLOGO ---------------------------------- */
const CATALOG = [
  /* —— SERVICIOS —— */
  {
    id: 'blanqueamiento-polus', cat: 'Servicios', name: 'Blanqueamiento POLUS',
    icon: 'ph-thin ph-sparkle', price: 4500, badge: 'El mejor del mercado',
    desc: 'Sistema robótico Ultrasonido + LED + Halógena. Aclara tu sonrisa varios tonos en una sesión de ~20 minutos, sin sensibilidad. Premiado 16 años consecutivos por Dental Advisor USA.',
  },
  {
    id: 'limpieza-tech', cat: 'Servicios', name: 'Limpieza de Alta Tecnología',
    icon: 'ph-thin ph-drop', price: 850,
    desc: 'Profilaxis profunda y precisa con equipos de última generación. Una limpieza suave, minuciosa y profundamente efectiva que protege tu salud dental.',
  },

  /* —— PACKS —— */
  {
    id: 'pack-sonrisa', cat: 'Packs', name: 'Pack Sonrisa Completa',
    icon: 'ph-thin ph-crown-simple', price: 4990, oldPrice: 5350, badge: 'Más vendido',
    desc: 'Limpieza de Alta Tecnología + Blanqueamiento POLUS en una sola visita. La rutina completa para una sonrisa sana y luminosa.',
    includes: ['Limpieza de Alta Tecnología', 'Blanqueamiento POLUS · 20 min', 'Valoración profesional previa'],
  },
  {
    id: 'pack-brillo-casa', cat: 'Packs', name: 'Pack Brillo en Casa',
    icon: 'ph-thin ph-house-line', price: 5590, oldPrice: 6040,
    desc: 'Blanqueamiento POLUS + kit de mantenimiento para conservar tu nuevo tono mucho más tiempo.',
    includes: ['Blanqueamiento POLUS', 'Gel de mantenimiento', 'Cepillo Smile Room'],
  },

  /* —— PRODUCTOS (para llevar a casa) —— */
  {
    id: 'gel-mantenimiento', cat: 'Productos', name: 'Gel de Mantenimiento',
    icon: 'ph-thin ph-drop-half', price: 650,
    desc: 'Gel de aclaramiento suave para uso en casa. Prolonga los resultados de tu blanqueamiento con un cuidado diario delicado con el esmalte.',
  },
  {
    id: 'cepillo', cat: 'Productos', name: 'Cepillo Smile Room',
    icon: 'ph-thin ph-paint-brush', price: 350,
    desc: 'Cepillo de cerdas suaves y cuidado premium, diseñado para una limpieza delicada que respeta el esmalte y el brillo de tu sonrisa.',
  },
  {
    id: 'pluma', cat: 'Productos', name: 'Pluma Blanqueadora',
    icon: 'ph-thin ph-pen-nib', price: 550,
    desc: 'Aplicador de precisión para retoques entre sesiones. Ideal para mantener el tono en las zonas más visibles de tu sonrisa.',
  },
];

const FILTERS = ['Todo', 'Servicios', 'Packs', 'Productos'];

/* ---------------------------------- CARRITO (hook) ---------------------------------- */
const useCart = () => {
  ensureShopStyle();
  const [items, setItems] = React.useState([]);   // [{id, qty}]
  const [open, setOpen] = React.useState(false);

  const add = (id) => {
    setItems(prev => {
      const found = prev.find(i => i.id === id);
      if (found) return prev.map(i => i.id === id ? { ...i, qty: i.qty + 1 } : i);
      return [...prev, { id, qty: 1 }];
    });
    setOpen(true);   // mini-cart: muestra el carrito al agregar
  };
  const setQty = (id, qty) => setItems(prev =>
    qty <= 0 ? prev.filter(i => i.id !== id) : prev.map(i => i.id === id ? { ...i, qty } : i));
  const remove = (id) => setItems(prev => prev.filter(i => i.id !== id));
  const clear = () => setItems([]);

  const detailed = items.map(i => ({ ...CATALOG.find(p => p.id === i.id), qty: i.qty }));
  const count = items.reduce((s, i) => s + i.qty, 0);
  const total = detailed.reduce((s, i) => s + i.price * i.qty, 0);

  return { items, detailed, count, total, add, setQty, remove, clear, open, setOpen };
};

/* ---------------------------------- TARJETA DE PRODUCTO ---------------------------------- */
const ProductCard = ({ p, onAdd, featured }) => (
  <div style={{
    background: 'var(--surface-card)', borderRadius: 'var(--radius-lg)',
    boxShadow: 'var(--shadow-sm), var(--ring-hairline)', padding: featured ? 32 : 26,
    display: 'flex', flexDirection: 'column', gap: 14, height: '100%', position: 'relative',
    transition: 'all var(--dur-base) var(--ease-out)',
  }}
  onMouseEnter={e => { e.currentTarget.style.boxShadow = 'var(--shadow-lg), var(--ring-hairline)'; e.currentTarget.style.transform = 'translateY(-3px)'; }}
  onMouseLeave={e => { e.currentTarget.style.boxShadow = 'var(--shadow-sm), var(--ring-hairline)'; e.currentTarget.style.transform = 'none'; }}>
    {p.badge && (
      <span style={{
        position: 'absolute', top: 18, right: 18, fontFamily: 'var(--font-display)', fontSize: 9.5,
        fontWeight: 700, letterSpacing: '.14em', textTransform: 'uppercase', padding: '6px 11px',
        borderRadius: 'var(--radius-pill)', background: 'var(--grad-gold)', color: 'var(--carbon)',
      }}>{p.badge}</span>
    )}
    <div style={{
      width: featured ? 60 : 52, height: featured ? 60 : 52, borderRadius: 'var(--radius-md)',
      background: 'var(--champagne-50)', color: 'var(--champagne-600)',
      display: 'flex', alignItems: 'center', justifyContent: 'center', marginBottom: 2,
    }}>
      <i className={p.icon} style={{ fontSize: featured ? 34 : 28, lineHeight: 0 }} />
    </div>
    <div style={{ fontFamily: 'var(--font-display)', fontWeight: 500, fontSize: featured ? 21 : 18, letterSpacing: '.05em', textTransform: 'uppercase', color: 'var(--text-strong)' }}>{p.name}</div>
    <p style={{ fontSize: 14, lineHeight: 1.65, color: 'var(--text-muted)', margin: 0 }}>{p.desc}</p>

    {p.includes && (
      <ul style={{ listStyle: 'none', margin: '2px 0 0', padding: 0, display: 'flex', flexDirection: 'column', gap: 9 }}>
        {p.includes.map(it => (
          <li key={it} style={{ display: 'flex', alignItems: 'center', gap: 10, fontSize: 13.5, color: 'var(--text-body)' }}>
            <i className="ph-thin ph-check" style={{ fontSize: 18, color: 'var(--champagne-600)', flexShrink: 0 }} />{it}
          </li>
        ))}
      </ul>
    )}

    <div style={{ marginTop: 'auto', paddingTop: 18, display: 'flex', alignItems: 'flex-end', justifyContent: 'space-between', gap: 12 }}>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
        {p.oldPrice && (
          <span style={{ fontSize: 12.5, color: 'var(--text-faint)', textDecoration: 'line-through', letterSpacing: '.02em' }}>{MXN(p.oldPrice)}</span>
        )}
        <span style={{ fontFamily: 'var(--font-display)', fontWeight: 300, fontSize: 24, color: 'var(--carbon)', letterSpacing: '.02em' }}>{MXN(p.price)}</span>
      </div>
      <KBtn variant={featured || p.badge ? 'gold' : 'primary'} size="sm" icon="ph-thin ph-plus" onClick={() => onAdd(p.id)}>Agregar</KBtn>
    </div>
  </div>
);

/* ---------------------------------- SECCIÓN TIENDA ---------------------------------- */
const Shop = ({ cart }) => {
  const { isMobile, isTablet } = useViewport();
  const [filter, setFilter] = React.useState('Todo');
  const list = CATALOG.filter(p => filter === 'Todo' || p.cat === filter);
  return (
    <section id="tienda" style={{ padding: isMobile ? '64px 22px' : '110px 32px', maxWidth: 1180, margin: '0 auto' }}>
      <Reveal>
        <SectionHeading center rule eyebrow="Tienda Smile Room"
          title="Compra tu sonrisa"
          subtitle="Servicios, packs y productos de mantenimiento — incluido el Blanqueamiento POLUS, el mejor sistema del mercado. Agrega al carrito y coordinamos tu cita o entrega." />
      </Reveal>

      {/* filtros */}
      <Reveal delay={120}>
        <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: 'center', gap: 8, marginTop: isMobile ? 30 : 44 }}>
          {FILTERS.map(f => (
            <button key={f} onClick={() => setFilter(f)} style={{
              fontFamily: 'var(--font-display)', fontSize: 11, fontWeight: 600, letterSpacing: '.12em',
              textTransform: 'uppercase', padding: '10px 18px', borderRadius: 'var(--radius-pill)', cursor: 'pointer',
              border: 'none', transition: 'all var(--dur-base) var(--ease-out)',
              background: filter === f ? 'var(--carbon)' : 'transparent',
              color: filter === f ? 'var(--linen-50)' : 'var(--text-muted)',
              boxShadow: filter === f ? 'none' : 'inset 0 0 0 1px var(--line-soft)',
            }}>{f}</button>
          ))}
        </div>
      </Reveal>

      {/* grid */}
      <div style={{
        display: 'grid',
        gridTemplateColumns: isMobile ? '1fr' : isTablet ? 'repeat(2,1fr)' : 'repeat(3,1fr)',
        gap: isMobile ? 16 : 24, marginTop: isMobile ? 28 : 40,
      }}>
        {list.map((p, k) => (
          <Reveal key={p.id} delay={(k % 3) * 110}>
            <ProductCard p={p} featured={!!p.badge} onAdd={cart.add} />
          </Reveal>
        ))}
      </div>
    </section>
  );
};

/* ---------------------------------- CARRITO DESLIZANTE ---------------------------------- */
const Stepper = ({ qty, onChange }) => (
  <div style={{ display: 'flex', alignItems: 'center', gap: 0, border: '1px solid var(--line-soft)', borderRadius: 'var(--radius-pill)', overflow: 'hidden' }}>
    <button onClick={() => onChange(qty - 1)} style={stepBtn}><i className="ph-thin ph-minus" style={{ fontSize: 15 }} /></button>
    <span style={{ minWidth: 28, textAlign: 'center', fontFamily: 'var(--font-display)', fontSize: 14, color: 'var(--text-strong)' }}>{qty}</span>
    <button onClick={() => onChange(qty + 1)} style={stepBtn}><i className="ph-thin ph-plus" style={{ fontSize: 15 }} /></button>
  </div>
);
const stepBtn = {
  width: 32, height: 32, display: 'flex', alignItems: 'center', justifyContent: 'center',
  background: 'transparent', border: 'none', cursor: 'pointer', color: 'var(--text-strong)',
};

const CartDrawer = ({ cart, onCheckout }) => {
  const { isMobile } = useViewport();
  const { open, setOpen, detailed, total, count, setQty } = cart;
  const close = () => setOpen(false);
  const W = isMobile ? '100%' : 420;

  return (
    <div style={{ position: 'fixed', inset: 0, zIndex: 70, pointerEvents: open ? 'auto' : 'none' }} aria-hidden={!open}>
      {/* scrim */}
      <div onClick={close} className="sr-drawer-scrim" style={{
        position: 'absolute', inset: 0, background: 'rgba(13,13,15,.5)', backdropFilter: 'blur(4px)',
        opacity: open ? 1 : 0,
      }} />
      {/* panel */}
      <aside className="sr-drawer-panel" style={{
        position: 'absolute', top: 0, right: 0, height: '100%', width: W, maxWidth: '100%',
        background: 'var(--surface-page)', boxShadow: 'var(--shadow-lg)',
        display: 'flex', flexDirection: 'column', transform: open ? 'none' : 'translateX(105%)',
      }}>
        {/* header */}
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '22px 24px', borderBottom: '1px solid var(--line-hairline)' }}>
          <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
            <i className="ph-thin ph-handbag-simple" style={{ fontSize: 24, color: 'var(--carbon)' }} />
            <span style={{ fontFamily: 'var(--font-display)', fontWeight: 500, fontSize: 16, letterSpacing: '.14em', textTransform: 'uppercase', color: 'var(--text-strong)' }}>
              {`Bolsa${count ? ` · ${count}` : ''}`}
            </span>
          </div>
          <i className="ph-thin ph-x" onClick={close} style={{ fontSize: 26, cursor: 'pointer', color: 'var(--text-muted)' }} />
        </div>

        {detailed.length === 0 ? (
          <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', textAlign: 'center', gap: 16, padding: '40px 32px' }}>
            <i className="ph-thin ph-handbag-simple" style={{ fontSize: 48, color: 'var(--text-faint)' }} />
            <p style={{ fontSize: 15, color: 'var(--text-muted)', margin: 0 }}>Tu bolsa está vacía.</p>
            <KBtn variant="gold" size="md" onClick={close}>Ver tienda</KBtn>
          </div>
        ) : (
          <React.Fragment>
            {/* items */}
            <div style={{ flex: 1, overflow: 'auto', padding: '8px 24px' }}>
              {detailed.map(it => (
                <div key={it.id} style={{ display: 'flex', gap: 14, padding: '18px 0', borderBottom: '1px solid var(--line-hairline)' }}>
                  <div style={{ width: 52, height: 52, flexShrink: 0, borderRadius: 'var(--radius-md)', background: 'var(--champagne-50)', color: 'var(--champagne-600)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
                    <i className={it.icon} style={{ fontSize: 26 }} />
                  </div>
                  <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: 8 }}>
                    <div style={{ display: 'flex', justifyContent: 'space-between', gap: 10 }}>
                      <span style={{ fontFamily: 'var(--font-display)', fontSize: 13, fontWeight: 600, letterSpacing: '.06em', textTransform: 'uppercase', color: 'var(--text-strong)', lineHeight: 1.3 }}>{it.name}</span>
                      <i className="ph-thin ph-trash" onClick={() => setQty(it.id, 0)} style={{ fontSize: 18, cursor: 'pointer', color: 'var(--text-faint)', flexShrink: 0 }} />
                    </div>
                    <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
                      <Stepper qty={it.qty} onChange={q => setQty(it.id, q)} />
                      <span style={{ fontFamily: 'var(--font-display)', fontSize: 15, color: 'var(--carbon)' }}>{MXN(it.price * it.qty)}</span>
                    </div>
                  </div>
                </div>
              ))}
            </div>
            {/* footer / checkout */}
            <div style={{ padding: '20px 24px', borderTop: '1px solid var(--line-hairline)', display: 'flex', flexDirection: 'column', gap: 16 }}>
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
                <span style={{ fontFamily: 'var(--font-display)', fontSize: 12, fontWeight: 600, letterSpacing: '.16em', textTransform: 'uppercase', color: 'var(--text-muted)' }}>Total</span>
                <span style={{ fontFamily: 'var(--font-display)', fontWeight: 300, fontSize: 26, color: 'var(--carbon)' }}>{MXN(total)}</span>
              </div>
              <KBtn variant="gold" size="lg" icon="ph-thin ph-lock-simple" onClick={onCheckout} style={{ width: '100%', height: 62, fontSize: 14 }}>Finalizar pedido</KBtn>
              <p style={{ fontSize: 11.5, lineHeight: 1.5, color: 'var(--text-faint)', textAlign: 'center', margin: 0 }}>
                Pago seguro procesado con Stripe. Servicios sujetos a valoración clínica previa.
              </p>
            </div>
          </React.Fragment>
        )}
      </aside>
    </div>
  );
};

/* botón de carrito para el nav (con badge animado) */
const CartButton = ({ cart, light }) => (
  <button onClick={() => cart.setOpen(true)} aria-label="Bolsa" style={{
    position: 'relative', background: 'none', border: 'none', cursor: 'pointer', padding: 6,
    display: 'flex', color: light ? 'var(--linen-50)' : 'var(--carbon)',
  }}>
    <i className="ph-thin ph-handbag-simple" style={{ fontSize: 24 }} />
    {cart.count > 0 && (
      <span key={cart.count} className="sr-cart-badge" style={{
        position: 'absolute', top: -2, right: -2, minWidth: 18, height: 18, padding: '0 5px',
        borderRadius: 'var(--radius-pill)', background: 'var(--grad-gold)', color: 'var(--carbon)',
        fontFamily: 'var(--font-display)', fontSize: 10, fontWeight: 700,
        display: 'flex', alignItems: 'center', justifyContent: 'center',
      }}>{cart.count}</span>
    )}
  </button>
);

Object.assign(window, { useCart, Shop, CartDrawer, CartButton, ProductCard, MXN });
