/* global React, Icon, ProductArt, fmtMXN */
// Admin panel — dashboard, products, orders, customers, coupons, categories, blog, stores, settings

const { useState: useStateA, useEffect: useEffectA, useMemo: useMemoA } = React;

// ============ ADMIN ENTRY ============
function PageAdmin({ route, navigate, user, onLogout }) {
  const tab = route.tab || 'dashboard';
  const setTab = (t) => navigate('admin', { tab: t });

  const sections = [
  { id: 'dashboard', label: 'Dashboard', icon: Icon.bolt },
  { id: 'products', label: 'Productos', icon: Icon.cart },
  { id: 'orders', label: 'Pedidos', icon: Icon.truck },
  { id: 'customers', label: 'Clientes', icon: Icon.user },
  { id: 'coupons', label: 'Cupones', icon: Icon.shield },
  { id: 'categories', label: 'Categorías', icon: Icon.chev },
  { id: 'blog', label: 'Blog', icon: Icon.search },
  { id: 'stores', label: 'Sucursales', icon: Icon.pin },
  { id: 'settings', label: 'Configuración', icon: Icon.gear || Icon.shield }];


  return (
    <div className="admin-shell">
      <aside className="admin-sidebar">
        <div className="admin-brand">
          <img src="assets/logo-full.png" alt="BK MOTO" />
          <div className="admin-brand-tag">CONSOLE</div>
        </div>

        <div className="admin-user">
          <div className="admin-avatar">DK</div>
          <div>
            <div style={{ fontWeight: 600, fontSize: 13 }}>David Krola</div>
            <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>OWNER · SUPERADMIN</div>
          </div>
        </div>

        <div className="admin-nav-mobile">
          <select className="admin-nav-select" value={tab} onChange={(e)=>setTab(e.target.value)}>
            <optgroup label="Gestión">
              {sections.slice(0,5).map(s => <option key={s.id} value={s.id}>{s.label}</option>)}
            </optgroup>
            <optgroup label="Contenido">
              {sections.slice(5,8).map(s => <option key={s.id} value={s.id}>{s.label}</option>)}
            </optgroup>
            <optgroup label="Sistema">
              {sections.slice(8).map(s => <option key={s.id} value={s.id}>{s.label}</option>)}
            </optgroup>
          </select>
        </div>

        <nav className="admin-nav" data-comment-anchor="cac8cbbf11-nav-39-9">
          <div className="admin-nav-section">Gestión</div>
          {sections.slice(0, 5).map((s) =>
          <button key={s.id} className={`admin-nav-item ${tab === s.id ? 'on' : ''}`} onClick={() => setTab(s.id)}>
              <span className="admin-nav-icon">{s.icon()}</span>
              <span>{s.label}</span>
            </button>
          )}
          <div className="admin-nav-section">Contenido</div>
          {sections.slice(5, 8).map((s) =>
          <button key={s.id} className={`admin-nav-item ${tab === s.id ? 'on' : ''}`} onClick={() => setTab(s.id)}>
              <span className="admin-nav-icon">{s.icon()}</span>
              <span>{s.label}</span>
            </button>
          )}
          <div className="admin-nav-section">Sistema</div>
          {sections.slice(8).map((s) =>
          <button key={s.id} className={`admin-nav-item ${tab === s.id ? 'on' : ''}`} onClick={() => setTab(s.id)}>
              <span className="admin-nav-icon">{s.icon()}</span>
              <span>{s.label}</span>
            </button>
          )}
        </nav>

        <div className="admin-side-foot">
          <button className="admin-nav-item" onClick={() => navigate('home')}>
            <span className="admin-nav-icon">←</span>
            <span>Volver al sitio</span>
          </button>
          {onLogout && (
            <button className="admin-nav-item admin-nav-logout" onClick={()=>{ onLogout(); }}>
              <span className="admin-nav-icon">⎋</span>
              <span>Cerrar sesión</span>
            </button>
          )}
        </div>
      </aside>

      <main className="admin-main">
        {tab === 'dashboard' && <AdminDashboard navigate={navigate} setTab={setTab} />}
        {tab === 'products' && <AdminProducts />}
        {tab === 'orders' && <AdminOrders />}
        {tab === 'customers' && <AdminCustomers />}
        {tab === 'coupons' && <AdminCoupons />}
        {tab === 'categories' && <AdminCategories />}
        {tab === 'blog' && <AdminBlog />}
        {tab === 'stores' && <AdminStores />}
        {tab === 'settings' && <AdminSettings />}
      </main>
    </div>);

}

// ============ DASHBOARD ============
function AdminDashboard({ navigate, setTab }) {
  const kpis = [
  { label: 'Ingresos · mes', val: '$2,184,592', delta: '+12.4%', up: true, sub: 'vs. abril 2026' },
  { label: 'Pedidos', val: '342', delta: '+8.2%', up: true, sub: '214 entregados · 128 en curso' },
  { label: 'Ticket promedio', val: '$6,389', delta: '+3.7%', up: true, sub: 'avg de últimos 30 días' },
  { label: 'Conversión', val: '2.84%', delta: '−0.3%', up: false, sub: '4.2K visitas únicas' }];


  // Mock revenue chart — last 30 days
  const revenueData = useMemoA(() => {
    const points = [];
    let v = 60000;
    for (let i = 0; i < 30; i++) {
      v += Math.sin(i * 0.6) * 12000 + Math.cos(i * 0.3) * 8000 + (Math.random() * 6000 - 3000);
      v = Math.max(35000, Math.min(110000, v));
      points.push(v);
    }
    return points;
  }, []);
  const maxR = Math.max(...revenueData);
  const minR = Math.min(...revenueData);
  const W = 800,H = 220;
  const path = revenueData.map((v, i) => {
    const x = i / (revenueData.length - 1) * W;
    const y = H - (v - minR) / (maxR - minR) * (H - 20) - 10;
    return `${i === 0 ? 'M' : 'L'} ${x.toFixed(1)} ${y.toFixed(1)}`;
  }).join(' ');
  const areaPath = path + ` L ${W} ${H} L 0 ${H} Z`;

  const topProducts = window.BK_DATA.PRODUCTS.slice(0, 5).map((p, i) => ({
    ...p, sold: [142, 98, 76, 54, 47][i], revenue: p.price * [142, 98, 76, 54, 47][i]
  }));

  const recentOrders = [
  { id: 'BKM-928410', customer: 'Carlos M.', total: 14580, status: 'transit', date: 'Hace 12 min' },
  { id: 'BKM-928409', customer: 'Andrea L.', total: 3290, status: 'pending', date: 'Hace 28 min' },
  { id: 'BKM-928408', customer: 'Roberto P.', total: 8490, status: 'delivered', date: 'Hace 1h' },
  { id: 'BKM-928407', customer: 'Mariana V.', total: 26500, status: 'transit', date: 'Hace 2h' },
  { id: 'BKM-928406', customer: 'Pablo G.', total: 1890, status: 'delivered', date: 'Hace 3h' }];


  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Panel general</div>
          <h1>DASHBOARD</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>Hola David — esto es lo que pasó hoy.</p>
        </div>
        <div className="row" style={{ gap: 8 }}>
          <select className="field" style={{ width: 'auto', padding: '8px 12px' }}>
            <option>Hoy</option><option>Últimos 7 días</option><option defaultValue>Últimos 30 días</option><option>Este mes</option><option>Este año</option>
          </select>
          <button className="btn primary sm">+ Crear pedido</button>
        </div>
      </header>

      <div className="admin-kpi-grid">
        {kpis.map((k, i) =>
        <div key={i} className="admin-kpi">
            <div className="admin-kpi-label">{k.label}</div>
            <div className="admin-kpi-val">{k.val}</div>
            <div className="admin-kpi-meta">
              <span className={`admin-delta ${k.up ? 'up' : 'down'}`}>{k.up ? '▲' : '▼'} {k.delta}</span>
              <span className="muted" style={{ fontSize: 11 }}>{k.sub}</span>
            </div>
          </div>
        )}
      </div>

      <div className="admin-row-2">
        <section className="admin-card">
          <header className="admin-card-head">
            <div>
              <h3>Ingresos · 30 días</h3>
              <div className="muted mono" style={{ fontSize: 10, letterSpacing: '.16em' }}>EN MXN · POR DÍA</div>
            </div>
            <div className="display" style={{ fontSize: 28, color: 'var(--blood)' }}>{fmtMXN(revenueData.reduce((a, b) => a + b, 0))}</div>
          </header>
          <svg viewBox={`0 0 ${W} ${H}`} preserveAspectRatio="none" style={{ width: '100%', height: 220, marginTop: 14 }}>
            <defs>
              <linearGradient id="adm-grad" x1="0" y1="0" x2="0" y2="1">
                <stop offset="0%" stopColor="var(--blood)" stopOpacity=".35" />
                <stop offset="100%" stopColor="var(--blood)" stopOpacity="0" />
              </linearGradient>
            </defs>
            <g stroke="var(--line)" strokeWidth="1">
              {[0.2, 0.4, 0.6, 0.8].map((p) => <line key={p} x1="0" y1={H * p} x2={W} y2={H * p} />)}
            </g>
            <path d={areaPath} fill="url(#adm-grad)" />
            <path d={path} fill="none" stroke="var(--blood)" strokeWidth="2" />
            {revenueData.map((v, i) => {
              const x = i / (revenueData.length - 1) * W;
              const y = H - (v - minR) / (maxR - minR) * (H - 20) - 10;
              return <circle key={i} cx={x} cy={y} r="2" fill="var(--blood)" opacity={i === revenueData.length - 1 ? 1 : 0} />;
            })}
          </svg>
          <div className="row" style={{ gap: 24, marginTop: 12, fontSize: 11, color: 'var(--text-muted)' }}>
            <span className="mono">14 ABR</span>
            <span className="mono" style={{ marginLeft: 'auto' }}>13 MAY</span>
          </div>
        </section>

        <section className="admin-card">
          <header className="admin-card-head">
            <h3>Productos top</h3>
            <a className="mono" style={{ fontSize: 10, color: 'var(--blood)', cursor: 'pointer' }} onClick={() => setTab('products')}>Ver todos →</a>
          </header>
          <div style={{ display: 'grid', gap: 10, marginTop: 8 }}>
            {topProducts.map((p, i) =>
            <div key={p.id} className="row" style={{ gap: 12, padding: '8px 0', borderBottom: i < 4 ? '1px solid var(--line)' : 'none' }}>
                <div className="mono" style={{ width: 18, color: 'var(--text-muted)', fontSize: 11 }}>{String(i + 1).padStart(2, '0')}</div>
                <div style={{ width: 40, height: 40, background: 'var(--bg-2)', border: '1px solid var(--line)' }}>
                  <ProductArt product={p} />
                </div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ fontSize: 13, fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{p.name}</div>
                  <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>{p.sold} vendidos</div>
                </div>
                <div className="display" style={{ fontSize: 14 }}>{fmtMXN(p.revenue)}</div>
              </div>
            )}
          </div>
        </section>
      </div>

      <section className="admin-card mt-24" data-comment-anchor="ad739eb9e3-section-213-7">
        <header className="admin-card-head">
          <div>
            <h3>Pedidos recientes</h3>
            <div className="muted mono" style={{ fontSize: 10, letterSpacing: '.16em' }}>ÚLTIMAS 24H</div>
          </div>
          <a className="mono" style={{ fontSize: 10, color: 'var(--blood)', cursor: 'pointer' }} onClick={() => setTab('orders')}>Ver todos →</a>
        </header>
        <table className="admin-table">
          <thead><tr>
            <th>Pedido</th><th>Cliente</th><th>Estado</th><th>Total</th><th>Tiempo</th><th></th>
          </tr></thead>
          <tbody>
            {recentOrders.map((o) =>
            <tr key={o.id}>
                <td className="mono" data-label="Pedido">{o.id}</td>
                <td data-label="Cliente">{o.customer}</td>
                <td data-label="Estado"><span className={`order-status ${o.status}`}>{{ delivered: 'Entregado', transit: 'En tránsito', pending: 'Procesando' }[o.status]}</span></td>
                <td className="display" data-label="Total" style={{ fontSize: 16 }}>{fmtMXN(o.total)}</td>
                <td className="muted mono" data-label="Tiempo" style={{ fontSize: 11 }}>{o.date}</td>
                <td className="actions-cell"><button className="btn ghost sm">Ver</button></td>
              </tr>
            )}
          </tbody>
        </table>
      </section>

      <div className="admin-row-3 mt-24">
        <section className="admin-card admin-alert">
          <div className="eyebrow" style={{ color: 'var(--warn)' }}>⚠ Stock bajo</div>
          <h3 style={{ margin: '8px 0 4px' }}>5 productos por debajo del umbral</h3>
          <p className="muted" style={{ margin: 0, fontSize: 13 }}>Revisa antes de que se agoten — los compradores siguen llegando.</p>
          <button className="btn ghost sm mt-16" onClick={() => setTab('products')}>Revisar inventario →</button>
        </section>
        <section className="admin-card">
          <div className="eyebrow">Pendientes de envío</div>
          <h3 style={{ margin: '8px 0 4px' }}>14 pedidos esperando</h3>
          <p className="muted" style={{ margin: 0, fontSize: 13 }}>3 con prioridad express. Promedio de procesamiento: 4h.</p>
          <button className="btn primary sm mt-16">Procesar pendientes →</button>
        </section>
        <section className="admin-card">
          <div className="eyebrow">Devoluciones</div>
          <h3 style={{ margin: '8px 0 4px' }}>2 abiertas</h3>
          <p className="muted" style={{ margin: 0, fontSize: 13 }}>1 cambio de talla · 1 producto defectuoso (en revisión).</p>
          <button className="btn ghost sm mt-16">Ver casos →</button>
        </section>
      </div>
    </>);

}

// ============ PRODUCTS ============
function AdminProducts() {
  // Load overrides from localStorage
  const [overrides, setOverrides] = useStateA(() => {
    try {return JSON.parse(localStorage.getItem('bk_product_overrides')) || {};} catch {return {};}
  });
  useEffectA(() => {
    localStorage.setItem('bk_product_overrides', JSON.stringify(overrides));
    // Apply to BK_DATA so storefront reflects edits
    window.BK_DATA.PRODUCTS.forEach((p) => {
      if (overrides[p.id]) Object.assign(p, overrides[p.id]);
    });
  }, [overrides]);

  const products = window.BK_DATA.PRODUCTS;
  const [q, setQ] = useStateA('');
  const [catFilter, setCatFilter] = useStateA('');
  const [showHidden, setShowHidden] = useStateA(true);
  const [selected, setSelected] = useStateA(new Set());
  const [editing, setEditing] = useStateA(null); // product being edited in drawer
  const [adding, setAdding] = useStateA(false);

  const cats = window.BK_DATA.CATEGORIES;

  const filtered = products.filter((p) => {
    const norm = (s) => s.toLowerCase();
    if (q && !norm(p.name).includes(norm(q)) && !norm(p.brand).includes(norm(q)) && !norm(p.id).includes(norm(q))) return false;
    if (catFilter && p.cat !== catFilter) return false;
    if (!showHidden && p.hidden) return false;
    return true;
  });

  const updateProduct = (id, patch) => {
    setOverrides((o) => ({ ...o, [id]: { ...(o[id] || {}), ...patch } }));
  };

  const toggleSelect = (id) => {
    setSelected((s) => {
      const n = new Set(s);
      n.has(id) ? n.delete(id) : n.add(id);
      return n;
    });
  };

  const stockBadge = (stock) => {
    if (stock === 0) return <span className="stock-pill out">SIN STOCK</span>;
    if (stock < 5) return <span className="stock-pill low">{stock} unid.</span>;
    return <span className="stock-pill ok">{stock} unid.</span>;
  };

  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Catálogo</div>
          <h1>PRODUCTOS</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>{products.length} productos · {filtered.length} mostrados</p>
        </div>
        <div className="row" style={{ gap: 8 }}>
          <button className="btn ghost sm">↓ Importar CSV</button>
          <button className="btn ghost sm">↑ Exportar</button>
          <button className="btn primary sm" onClick={() => setAdding(true)}>+ Nuevo producto</button>
        </div>
      </header>

      <section className="admin-card no-pad">
        <div className="admin-table-toolbar">
          <div className="search-input" style={{ flex: 1, maxWidth: 340 }}>
            <span style={{ color: 'var(--text-muted)' }}>{Icon.search()}</span>
            <input placeholder="Buscar por nombre, marca o SKU…" value={q} onChange={(e) => setQ(e.target.value)} />
          </div>
          <select className="field" style={{ width: 'auto', padding: '10px 12px' }} value={catFilter} onChange={(e) => setCatFilter(e.target.value)}>
            <option value="">Todas las categorías</option>
            {cats.map((c) => <option key={c.slug} value={c.slug}>{c.name}</option>)}
          </select>
          <label className="checkbox"><input type="checkbox" checked={showHidden} onChange={(e) => setShowHidden(e.target.checked)} /><span>Mostrar ocultos</span></label>
          {selected.size > 0 &&
          <div className="row" style={{ gap: 8, marginLeft: 'auto' }}>
              <span className="mono" style={{ fontSize: 11, color: 'var(--text-muted)' }}>{selected.size} seleccionados</span>
              <button className="btn ghost sm">Ocultar</button>
              <button className="btn ghost sm">Duplicar</button>
              <button className="btn ghost sm" style={{ color: 'var(--blood)', borderColor: 'var(--blood)' }}>Eliminar</button>
            </div>
          }
        </div>

        <table className="admin-table">
          <thead><tr>
            <th style={{ width: 36 }}><input type="checkbox" onChange={(e) => setSelected(e.target.checked ? new Set(filtered.map((p) => p.id)) : new Set())} /></th>
            <th>Producto</th>
            <th>SKU</th>
            <th>Categoría</th>
            <th>Precio</th>
            <th>Stock</th>
            <th>Estado</th>
            <th></th>
          </tr></thead>
          <tbody>
            {filtered.map((p) => {
              const isHidden = p.hidden;
              return (
                <tr key={p.id} style={{ opacity: isHidden ? .5 : 1 }}>
                  <td className="bulk-select-cell"><input type="checkbox" checked={selected.has(p.id)} onChange={() => toggleSelect(p.id)} /></td>
                  <td data-label="Producto">
                    <div className="row" style={{ gap: 10 }}>
                      <div style={{ width: 40, height: 40, background: 'var(--bg-2)', border: '1px solid var(--line)' }}>
                        <ProductArt product={p} />
                      </div>
                      <div style={{ minWidth: 0 }}>
                        <div style={{ fontSize: 13, fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: 240 }}>{p.name}</div>
                        <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)', letterSpacing: '.12em' }}>{p.brand}</div>
                      </div>
                    </div>
                  </td>
                  <td className="mono" data-label="SKU" style={{ fontSize: 11 }}>{p.id.toUpperCase()}</td>
                  <td data-label="Categoría"><span className="cat-pill">{cats.find((c) => c.slug === p.cat)?.name}</span></td>
                  <td data-label="Precio">
                    <InlineEditPrice value={p.price} onChange={(v) => updateProduct(p.id, { price: v })} />
                  </td>
                  <td data-label="Stock">
                    <InlineEditNumber value={p.stock} onChange={(v) => updateProduct(p.id, { stock: v })} after={stockBadge(p.stock)} />
                  </td>
                  <td data-label="Estado">
                    <button className={`status-toggle ${isHidden ? 'off' : 'on'}`} onClick={() => updateProduct(p.id, { hidden: !isHidden })}>
                      <span className="dot"></span>
                      {isHidden ? 'Oculto' : 'Activo'}
                    </button>
                  </td>
                  <td className="actions-cell">
                    <div className="row" style={{ gap: 4, justifyContent: 'flex-end' }}>
                      <button className="ic-btn" onClick={() => setEditing(p)} title="Editar">
                        <span aria-hidden="true">✏</span><span className="ic-btn-label">Editar</span>
                      </button>
                      <button className="ic-btn" title="Duplicar">
                        <span aria-hidden="true">⎘</span><span className="ic-btn-label">Duplicar</span>
                      </button>
                      <button className="ic-btn" title="Eliminar" data-variant="danger" style={{ color: 'var(--blood)' }}>
                        <span aria-hidden="true">×</span><span className="ic-btn-label">Eliminar</span>
                      </button>
                    </div>
                  </td>
                </tr>);

            })}
          </tbody>
        </table>
      </section>

      {(editing || adding) &&
      <ProductEditorDrawer
        product={editing}
        isNew={adding}
        cats={cats}
        onClose={() => {setEditing(null);setAdding(false);}}
        onSave={(patch) => {
          if (editing) updateProduct(editing.id, patch);
          // For "new" we'd need to push a new product — left as demo
          setEditing(null);setAdding(false);
        }} />

      }
    </>);

}

function InlineEditPrice({ value, onChange }) {
  const [editing, setEditing] = useStateA(false);
  const [v, setV] = useStateA(value);
  useEffectA(() => setV(value), [value]);
  const commit = () => {
    const n = +v;
    if (!isNaN(n) && n > 0) onChange(n);else
    setV(value);
    setEditing(false);
  };
  if (editing) {
    return <input autoFocus className="inline-edit" type="number" value={v} onChange={(e) => setV(e.target.value)} onBlur={commit} onKeyDown={(e) => e.key === 'Enter' && commit()} />;
  }
  return <button className="inline-edit-display" onClick={() => setEditing(true)}>
    <span className="display" style={{ fontSize: 18 }}>{fmtMXN(value)}</span>
  </button>;
}

function InlineEditNumber({ value, onChange, after }) {
  const [editing, setEditing] = useStateA(false);
  const [v, setV] = useStateA(value);
  useEffectA(() => setV(value), [value]);
  const commit = () => {
    const n = parseInt(v, 10);
    if (!isNaN(n) && n >= 0) onChange(n);else
    setV(value);
    setEditing(false);
  };
  if (editing) {
    return <input autoFocus className="inline-edit" type="number" value={v} onChange={(e) => setV(e.target.value)} onBlur={commit} onKeyDown={(e) => e.key === 'Enter' && commit()} />;
  }
  return <button className="inline-edit-display" onClick={() => setEditing(true)}>{after}</button>;
}

function ProductEditorDrawer({ product, isNew, cats, onClose, onSave }) {
  const [form, setForm] = useStateA(product || {
    name: '', brand: '', cat: 'cascos', price: 0, oldPrice: 0, stock: 0, description: '', tags: [], colors: ['#0A0A0A'], sizes: ['Unica']
  });
  const update = (k, v) => setForm((f) => ({ ...f, [k]: v }));

  return (
    <>
      <div className="drawer-scrim open" onClick={onClose} />
      <aside className="drawer open" style={{ width: 'min(560px, 100%)' }}>
        <header className="drawer-head">
          <div>
            <div className="eyebrow">{isNew ? 'Nuevo producto' : 'Editar producto'}</div>
            <h3>{isNew ? 'AGREGAR AL CATÁLOGO' : form.name?.toUpperCase()}</h3>
          </div>
          <button className="icon-btn" onClick={onClose}>{Icon.close()}</button>
        </header>
        <div className="drawer-body" style={{ display: 'grid', gap: 18 }} data-comment-anchor="d124f564e4-div-472-9">
          <div>
            <label className="field-label">Imagen del producto</label>
            <div className="product-image-uploader">
              <div className="product-image-preview">
                {form.image ?
                <img src={form.image} alt="" style={{ width: '100%', height: '100%', objectFit: 'cover', display: 'block' }} /> :

                <div className="product-image-empty">
                    <div style={{ fontSize: 32, opacity: .3, marginBottom: 4 }}>⤒</div>
                    <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)', letterSpacing: '.12em' }}>SIN IMAGEN</div>
                  </div>
                }
              </div>
              <div className="product-image-actions">
                <label className="btn ghost sm" style={{ cursor: 'pointer' }}>
                  {form.image ? 'Cambiar imagen' : '↑ Subir imagen'}
                  <input type="file" accept="image/*" style={{ display: 'none' }} onChange={(e) => {
                    const file = e.target.files?.[0];
                    if (!file) return;
                    if (file.size > 4 * 1024 * 1024) {alert('Imagen muy grande (max 4MB).');return;}
                    const reader = new FileReader();
                    reader.onload = () => update('image', reader.result);
                    reader.readAsDataURL(file);
                  }} />
                </label>
                {form.image &&
                <button className="btn ghost sm" onClick={() => update('image', null)} style={{ color: 'var(--blood)', borderColor: 'var(--blood)' }}>Quitar</button>
                }
                <p className="mono" style={{ fontSize: 10, color: 'var(--text-muted)', margin: '8px 0 0', letterSpacing: '.12em' }}>JPG / PNG / WEBP · máx. 4MB · 1:1 recomendado</p>
              </div>
            </div>
          </div>
          <div>
            <label className="field-label">Nombre del producto *</label>
            <input className="field" value={form.name || ''} onChange={(e) => update('name', e.target.value)} placeholder="Casco Integral GP-Pro" />
          </div>
          <div className="grid-2">
            <div>
              <label className="field-label">Marca *</label>
              <input className="field" value={form.brand || ''} onChange={(e) => update('brand', e.target.value)} />
            </div>
            <div>
              <label className="field-label">Categoría *</label>
              <select className="field" value={form.cat} onChange={(e) => update('cat', e.target.value)}>
                {cats.map((c) => <option key={c.slug} value={c.slug}>{c.name}</option>)}
              </select>
            </div>
          </div>
          <div className="grid-2">
            <div>
              <label className="field-label">Precio actual (MXN) *</label>
              <input className="field" type="number" value={form.price || 0} onChange={(e) => update('price', +e.target.value)} />
            </div>
            <div>
              <label className="field-label">Precio anterior (opcional)</label>
              <input className="field" type="number" value={form.oldPrice || 0} onChange={(e) => update('oldPrice', +e.target.value)} />
            </div>
          </div>
          <div className="grid-2">
            <div>
              <label className="field-label">Stock</label>
              <input className="field" type="number" value={form.stock || 0} onChange={(e) => update('stock', +e.target.value)} />
            </div>
            <div>
              <label className="field-label">SKU</label>
              <input className="field" value={form.id?.toUpperCase() || ''} placeholder="Auto-generado" disabled={!isNew} />
            </div>
          </div>
          <div>
            <label className="field-label">Descripción</label>
            <textarea className="field" rows="4" value={form.description || ''} onChange={(e) => update('description', e.target.value)} />
          </div>
          <div>
            <label className="field-label">Tallas (separadas por coma)</label>
            <input className="field" value={(form.sizes || []).join(', ')} onChange={(e) => update('sizes', e.target.value.split(',').map((s) => s.trim()).filter(Boolean))} />
          </div>
          <div>
            <label className="field-label">Colores disponibles</label>
            <div className="swatch-row" style={{ flexWrap: 'wrap', gap: 8 }}>
              {(form.colors || []).map((c, i) =>
              <div key={i} className="row" style={{ gap: 4 }}>
                  <input type="color" value={c} onChange={(e) => {
                  const nc = [...form.colors];nc[i] = e.target.value;update('colors', nc);
                }} style={{ width: 36, height: 36, border: '1px solid var(--line)', background: 'transparent', cursor: 'pointer' }} />
                  <button className="ic-btn" onClick={() => update('colors', form.colors.filter((_, j) => j !== i))} style={{ color: 'var(--blood)' }}>×</button>
                </div>
              )}
              <button className="btn ghost sm" onClick={() => update('colors', [...(form.colors || []), '#000000'])}>+ Color</button>
            </div>
          </div>
          <div>
            <label className="field-label">Etiquetas (separadas por coma)</label>
            <input className="field" value={(form.tags || []).join(', ')} onChange={(e) => update('tags', e.target.value.split(',').map((s) => s.trim()).filter(Boolean))} placeholder="Racing, Carbono, DOT" />
          </div>
          <label className="checkbox"><input type="checkbox" checked={!!form.hidden} onChange={(e) => update('hidden', e.target.checked)} /><span>Producto oculto (no visible en tienda)</span></label>
        </div>
        <div className="drawer-foot">
          <button className="btn ghost" onClick={onClose}>Cancelar</button>
          <button className="btn primary" onClick={() => onSave(form)}>{isNew ? 'Crear producto' : 'Guardar cambios'}</button>
        </div>
      </aside>
    </>);

}

// ============ ORDERS ============
function AdminOrders() {
  const products = window.BK_DATA.PRODUCTS;
  const allOrders = useMemoA(() => {
    const statuses = ['delivered', 'transit', 'pending', 'cancelled', 'returned'];
    const names = ['Carlos Mtz.', 'Andrea Lozano', 'Roberto Pérez', 'Mariana Vega', 'Pablo G.', 'Lucía A.', 'Iván T.', 'Sofía R.', 'Mario K.', 'Daniela L.', 'Esteban Q.', 'Karla J.'];
    const cities = ['CDMX', 'GDL', 'MTY', 'QRO', 'PUE', 'MOR', 'VER'];
    return Array.from({ length: 32 }).map((_, i) => {
      const items = [products[i * 7 % products.length], products[(i * 11 + 3) % products.length]].slice(0, 1 + i % 2);
      return {
        id: `BKM-${928410 - i}`,
        customer: names[i % names.length],
        city: cities[i % cities.length],
        items,
        total: items.reduce((s, p) => s + p.price, 0),
        status: i < 4 ? statuses[0] : i < 12 ? statuses[1] : i < 18 ? statuses[2] : statuses[i % 5],
        date: i < 1 ? 'hace 12 min' : i < 3 ? `hace ${i}h` : `hace ${i} días`,
        payMethod: ['Tarjeta', 'Mercado Pago', 'OXXO', 'Kueski'][i % 4]
      };
    });
  }, []);

  const [statusFilter, setStatusFilter] = useStateA('all');
  const [q, setQ] = useStateA('');
  const filtered = allOrders.filter((o) => {
    if (statusFilter !== 'all' && o.status !== statusFilter) return false;
    if (q && !o.id.toLowerCase().includes(q.toLowerCase()) && !o.customer.toLowerCase().includes(q.toLowerCase())) return false;
    return true;
  });

  const counts = {
    all: allOrders.length,
    pending: allOrders.filter((o) => o.status === 'pending').length,
    transit: allOrders.filter((o) => o.status === 'transit').length,
    delivered: allOrders.filter((o) => o.status === 'delivered').length,
    cancelled: allOrders.filter((o) => o.status === 'cancelled').length,
    returned: allOrders.filter((o) => o.status === 'returned').length
  };
  const statusLabel = { pending: 'Procesando', transit: 'En tránsito', delivered: 'Entregado', cancelled: 'Cancelado', returned: 'Devuelto' };

  const [selected, setSelected] = useStateA(null);

  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Operaciones</div>
          <h1>PEDIDOS</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>{allOrders.length} pedidos totales</p>
        </div>
        <div className="row" style={{ gap: 8 }}>
          <button className="btn ghost sm">Exportar CSV</button>
          <button className="btn primary sm">+ Crear pedido manual</button>
        </div>
      </header>

      <div className="admin-tabs">
        {[
        ['all', 'Todos'], ['pending', 'Procesando'], ['transit', 'En tránsito'], ['delivered', 'Entregados'], ['cancelled', 'Cancelados'], ['returned', 'Devueltos']].
        map(([k, l]) =>
        <button key={k} className={`admin-tab ${statusFilter === k ? 'on' : ''}`} onClick={() => setStatusFilter(k)}>
            {l} <span className="mono" style={{ marginLeft: 6, color: 'var(--text-muted)', fontSize: 10 }}>{counts[k]}</span>
          </button>
        )}
      </div>

      <section className="admin-card no-pad">
        <div className="admin-table-toolbar">
          <div className="search-input" style={{ flex: 1, maxWidth: 340 }}>
            <span style={{ color: 'var(--text-muted)' }}>{Icon.search()}</span>
            <input placeholder="Buscar por # pedido o cliente…" value={q} onChange={(e) => setQ(e.target.value)} />
          </div>
        </div>
        <table className="admin-table">
          <thead><tr>
            <th>Pedido</th><th>Cliente</th><th>Ciudad</th><th>Productos</th><th>Pago</th><th>Total</th><th>Estado</th><th>Fecha</th><th></th>
          </tr></thead>
          <tbody>
            {filtered.map((o) =>
            <tr key={o.id} onClick={() => setSelected(o)} style={{ cursor: 'pointer' }}>
                <td className="mono" data-label="Pedido">{o.id}</td>
                <td data-label="Cliente">{o.customer}</td>
                <td className="muted" data-label="Ciudad">{o.city}</td>
                <td className="muted" data-label="Productos">{o.items.length} {o.items.length === 1 ? 'art.' : 'arts.'}</td>
                <td className="mono" data-label="Pago" style={{ fontSize: 11 }}>{o.payMethod}</td>
                <td className="display" data-label="Total" style={{ fontSize: 16 }}>{fmtMXN(o.total)}</td>
                <td data-label="Estado"><span className={`order-status ${o.status === 'cancelled' || o.status === 'returned' ? 'pending' : o.status}`}>{statusLabel[o.status]}</span></td>
                <td className="muted mono" data-label="Fecha" style={{ fontSize: 11 }}>{o.date}</td>
                <td className="actions-cell"><button className="btn ghost sm">→</button></td>
              </tr>
            )}
          </tbody>
        </table>
      </section>

      {selected &&
      <>
          <div className="drawer-scrim open" onClick={() => setSelected(null)} />
          <aside className="drawer open" style={{ width: 'min(540px, 100%)' }}>
            <header className="drawer-head">
              <div>
                <div className="eyebrow">Pedido</div>
                <h3>{selected.id}</h3>
              </div>
              <button className="icon-btn" onClick={() => setSelected(null)}>{Icon.close()}</button>
            </header>
            <div className="drawer-body">
              <div className="row" style={{ gap: 14, marginBottom: 20 }}>
                <span className={`order-status ${selected.status === 'cancelled' || selected.status === 'returned' ? 'pending' : selected.status}`}>{statusLabel[selected.status]}</span>
                <span className="muted mono" style={{ fontSize: 11 }}>{selected.date}</span>
              </div>

              <h4 className="mono" style={{ fontSize: 11, color: 'var(--text-muted)', marginTop: 0 }}>CLIENTE</h4>
              <div style={{ padding: 14, border: '1px solid var(--line)', marginBottom: 18 }}>
                <div style={{ fontWeight: 500 }}>{selected.customer}</div>
                <div className="mono" style={{ fontSize: 11, color: 'var(--text-muted)' }}>{selected.customer.toLowerCase().replace(/[. ]/g, '')}@email.mx</div>
                <div style={{ fontSize: 13, marginTop: 6 }}>Av. Insurgentes Sur 1234, Col. Roma, {selected.city}, MX 06700</div>
              </div>

              <h4 className="mono" style={{ fontSize: 11, color: 'var(--text-muted)' }}>PRODUCTOS</h4>
              <div>
                {selected.items.map((p, i) =>
              <div key={i} className="row" style={{ gap: 12, padding: '10px 0', borderBottom: '1px solid var(--line)' }}>
                    <div style={{ width: 48, height: 48, background: 'var(--bg-2)', border: '1px solid var(--line)' }}>
                      <ProductArt product={p} />
                    </div>
                    <div style={{ flex: 1, minWidth: 0 }}>
                      <div style={{ fontSize: 13, fontWeight: 500 }}>{p.name}</div>
                      <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>{p.brand}</div>
                    </div>
                    <div className="display" style={{ fontSize: 16 }}>{fmtMXN(p.price)}</div>
                  </div>
              )}
              </div>

              <div className="between mt-16" style={{ paddingTop: 16, borderTop: '1px solid var(--line-strong)' }}>
                <span className="mono">TOTAL</span>
                <span className="display" style={{ fontSize: 24, color: 'var(--blood)' }}>{fmtMXN(selected.total)}</span>
              </div>

              <h4 className="mono mt-24" style={{ fontSize: 11, color: 'var(--text-muted)' }}>ACTUALIZAR ESTADO</h4>
              <select className="field" defaultValue={selected.status}>
                {Object.entries(statusLabel).map(([k, l]) => <option key={k} value={k}>{l}</option>)}
              </select>
            </div>
            <div className="drawer-foot">
              <button className="btn ghost" onClick={() => setSelected(null)}>Cerrar</button>
              <button className="btn primary">Guardar cambios</button>
            </div>
          </aside>
        </>
      }
    </>);

}

// ============ CUSTOMERS ============
function AdminCustomers() {
  const customers = useMemoA(() => {
    const names = ['Carlos Martínez', 'Andrea Lozano', 'Roberto Pérez', 'Mariana Vega', 'Pablo García', 'Lucía Aguirre', 'Iván Tovar', 'Sofía Reyes', 'Mario Krola', 'Daniela López', 'Esteban Quintero', 'Karla Jiménez', 'Roberto Salas', 'Javier Núñez', 'Patricia Ruiz'];
    const cities = ['CDMX', 'GDL', 'MTY', 'QRO', 'PUE'];
    return names.map((n, i) => ({
      id: `cust-${String(i + 1).padStart(3, '0')}`,
      name: n,
      email: n.toLowerCase().split(' ')[0] + '.' + n.toLowerCase().split(' ')[1] + '@email.mx',
      city: cities[i % cities.length],
      orders: 1 + i * 7 % 18,
      spent: 1290 + i * 4327 % 38000,
      joined: ['2024', '2024', '2025', '2025', '2026'][i % 5],
      vip: i < 3
    }));
  }, []);
  const [q, setQ] = useStateA('');
  const filtered = customers.filter((c) => !q || c.name.toLowerCase().includes(q.toLowerCase()) || c.email.includes(q.toLowerCase()));

  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">CRM</div>
          <h1>CLIENTES</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>{customers.length} clientes registrados · 3 VIP</p>
        </div>
        <button className="btn ghost sm">Exportar CSV</button>
      </header>

      <div className="admin-kpi-grid">
        <div className="admin-kpi"><div className="admin-kpi-label">Clientes totales</div><div className="admin-kpi-val">2,184</div><div className="muted mono" style={{ fontSize: 11 }}>+247 este mes</div></div>
        <div className="admin-kpi"><div className="admin-kpi-label">Repetidores</div><div className="admin-kpi-val">38%</div><div className="muted mono" style={{ fontSize: 11 }}>830 con 2+ compras</div></div>
        <div className="admin-kpi"><div className="admin-kpi-label">LTV promedio</div><div className="admin-kpi-val">{fmtMXN(8420)}</div><div className="muted mono" style={{ fontSize: 11 }}>histórico</div></div>
        <div className="admin-kpi"><div className="admin-kpi-label">Newsletter</div><div className="admin-kpi-val">1,402</div><div className="muted mono" style={{ fontSize: 11 }}>64% opt-in</div></div>
      </div>

      <section className="admin-card no-pad mt-24">
        <div className="admin-table-toolbar">
          <div className="search-input" style={{ flex: 1, maxWidth: 340 }}>
            <span style={{ color: 'var(--text-muted)' }}>{Icon.search()}</span>
            <input placeholder="Buscar por nombre o email…" value={q} onChange={(e) => setQ(e.target.value)} />
          </div>
        </div>
        <table className="admin-table">
          <thead><tr>
            <th>Cliente</th><th>Email</th><th>Ciudad</th><th>Pedidos</th><th>Total gastado</th><th>Miembro desde</th><th></th>
          </tr></thead>
          <tbody>
            {filtered.map((c) =>
            <tr key={c.id}>
                <td data-label="Cliente">
                  <div className="row" style={{ gap: 10 }}>
                    <div className="admin-avatar sm">{c.name.split(' ').map((p) => p[0]).join('').slice(0, 2)}</div>
                    <div>
                      <div style={{ fontWeight: 500, fontSize: 13 }}>{c.name} {c.vip && <span className="cat-pill" style={{ background: 'var(--blood)', color: '#fff', marginLeft: 6 }}>VIP</span>}</div>
                    </div>
                  </div>
                </td>
                <td className="mono" data-label="Email" style={{ fontSize: 11 }}>{c.email}</td>
                <td className="muted" data-label="Ciudad">{c.city}</td>
                <td className="display" data-label="Pedidos" style={{ fontSize: 16 }}>{c.orders}</td>
                <td className="display" data-label="Gastado" style={{ fontSize: 16, color: 'var(--blood)' }}>{fmtMXN(c.spent)}</td>
                <td className="muted mono" data-label="Desde" style={{ fontSize: 11 }}>{c.joined}</td>
                <td className="actions-cell"><button className="btn ghost sm">Ver</button></td>
              </tr>
            )}
          </tbody>
        </table>
      </section>
    </>);

}

// ============ COUPONS ============
function AdminCoupons() {
  const DEFAULT_COUPONS = [
  { code: 'RIDER10', type: 'percent', value: 10, uses: 142, maxUses: 500, expires: '31 MAY 2026', active: true },
  { code: 'BLACKWEEK35', type: 'percent', value: 35, uses: 847, maxUses: 1000, expires: '19 MAY 2026', active: true },
  { code: 'FREESHIP', type: 'shipping', value: 0, uses: 289, maxUses: null, expires: 'sin fecha', active: true },
  { code: 'PRIMERACOMPRA', type: 'mxn', value: 500, uses: 64, maxUses: null, expires: 'sin fecha', active: true },
  { code: 'STUDENT20', type: 'percent', value: 20, uses: 23, maxUses: 200, expires: '30 JUN 2026', active: true },
  { code: 'SUMMER22', type: 'percent', value: 15, uses: 401, maxUses: 401, expires: '31 AGO 2025', active: false }];

  const [coupons, setCoupons] = useStateA(() => {
    try {
      const stored = JSON.parse(localStorage.getItem('bk_coupons'));
      return Array.isArray(stored) ? stored : DEFAULT_COUPONS;
    } catch {return DEFAULT_COUPONS;}
  });
  useEffectA(() => {localStorage.setItem('bk_coupons', JSON.stringify(coupons));}, [coupons]);

  const typeLabel = { percent: '% descuento', mxn: 'MXN descuento', shipping: 'Envío gratis' };
  const typeColor = { percent: 'var(--blood)', mxn: 'var(--ok)', shipping: 'var(--warn)' };

  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Marketing</div>
          <h1>CUPONES</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>{coupons.filter((c) => c.active).length} activos</p>
        </div>
        <button className="btn primary sm">+ Crear cupón</button>
      </header>

      <section className="admin-card no-pad">
        <table className="admin-table">
          <thead><tr>
            <th>Código</th><th>Tipo</th><th>Descuento</th><th>Usos</th><th>Vence</th><th>Estado</th><th></th>
          </tr></thead>
          <tbody>
            {coupons.map((c, i) =>
            <tr key={c.code}>
                <td data-label="Código"><span className="coupon-code">{c.code}</span></td>
                <td data-label="Tipo"><span className="cat-pill" style={{ background: typeColor[c.type], color: '#fff' }}>{typeLabel[c.type]}</span></td>
                <td className="display" data-label="Descuento" style={{ fontSize: 18 }}>
                  {c.type === 'percent' && `${c.value}%`}
                  {c.type === 'mxn' && fmtMXN(c.value)}
                  {c.type === 'shipping' && 'Gratis'}
                </td>
                <td data-label="Usos">
                  <div className="row" style={{ gap: 8 }}>
                    <span className="mono">{c.uses}{c.maxUses ? ` / ${c.maxUses}` : ''}</span>
                    {c.maxUses &&
                  <div style={{ width: 60, height: 4, background: 'var(--bg-2)' }}>
                        <div style={{ width: `${Math.min(100, c.uses / c.maxUses * 100)}%`, height: '100%', background: 'var(--blood)' }} />
                      </div>
                  }
                  </div>
                </td>
                <td className="muted mono" data-label="Vence" style={{ fontSize: 11 }}>{c.expires}</td>
                <td data-label="Estado">
                  <button className={`status-toggle ${c.active ? 'on' : 'off'}`} onClick={() => {
                  setCoupons(coupons.map((x, j) => j === i ? { ...x, active: !x.active } : x));
                }}>
                    <span className="dot"></span>
                    {c.active ? 'Activo' : 'Pausado'}
                  </button>
                </td>
                <td className="actions-cell"><button className="btn ghost sm">Editar</button></td>
              </tr>
            )}
          </tbody>
        </table>
      </section>
    </>);

}

// ============ CATEGORIES ============
function AdminCategories() {
  const cats = window.BK_DATA.CATEGORIES;
  const products = window.BK_DATA.PRODUCTS;
  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Estructura</div>
          <h1>CATEGORÍAS</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>{cats.length} categorías · arrastra para reordenar</p>
        </div>
        <button className="btn primary sm">+ Nueva categoría</button>
      </header>
      <section className="admin-card no-pad">
        <table className="admin-table">
          <thead><tr>
            <th style={{ width: 36 }}>≡</th><th>Categoría</th><th>Slug</th><th>Productos</th><th>Visible</th><th></th>
          </tr></thead>
          <tbody>
            {cats.map((c, i) => {
              const count = products.filter((p) => p.cat === c.slug).length;
              return (
                <tr key={c.slug}>
                  <td className="muted" style={{ cursor: 'grab' }}>≡</td>
                  <td data-label="Categoría">
                    <div className="row" style={{ gap: 12 }}>
                      {c.image && <img src={c.image} alt="" style={{ width: 48, height: 36, objectFit: 'cover', border: '1px solid var(--line)' }} />}
                      <div>
                        <div style={{ fontWeight: 500 }}>{c.name}</div>
                        <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>{c.subtitle}</div>
                      </div>
                    </div>
                  </td>
                  <td className="mono" data-label="Slug" style={{ fontSize: 11 }}>/{c.slug}</td>
                  <td className="display" data-label="Productos" style={{ fontSize: 16 }}>{count}</td>
                  <td data-label="Visible"><button className="status-toggle on"><span className="dot"></span>Visible</button></td>
                  <td className="actions-cell">
                    <div className="row" style={{ gap: 4, justifyContent: 'flex-end' }}>
                      <button className="ic-btn">
                        <span aria-hidden="true">✏</span><span className="ic-btn-label">Editar</span>
                      </button>
                      <button className="ic-btn" data-variant="danger" style={{ color: 'var(--blood)' }}>
                        <span aria-hidden="true">×</span><span className="ic-btn-label">Eliminar</span>
                      </button>
                    </div>
                  </td>
                </tr>);

            })}
          </tbody>
        </table>
      </section>
    </>);

}

// ============ BLOG ============
function AdminBlog() {
  const posts = window.BK_DATA.BLOG;
  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Contenido</div>
          <h1>BLOG</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>{posts.length} entradas publicadas</p>
        </div>
        <button className="btn primary sm">+ Nuevo post</button>
      </header>
      <section className="admin-card no-pad">
        <table className="admin-table">
          <thead><tr>
            <th>Post</th><th>Categoría</th><th>Autor</th><th>Lectura</th><th>Estado</th><th>Fecha</th><th></th>
          </tr></thead>
          <tbody>
            {posts.map((p) =>
            <tr key={p.id}>
                <td data-label="Post">
                  <div className="row" style={{ gap: 12 }}>
                    {p.image && <img src={p.image} alt="" style={{ width: 64, height: 40, objectFit: 'cover', border: '1px solid var(--line)' }} />}
                    <div style={{ minWidth: 0 }}>
                      <div style={{ fontWeight: 500, fontSize: 13 }}>{p.title}</div>
                      <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>{p.excerpt.slice(0, 60)}…</div>
                    </div>
                  </div>
                </td>
                <td data-label="Categoría"><span className="cat-pill">{p.cat}</span></td>
                <td className="muted" data-label="Autor">{p.author}</td>
                <td className="mono" data-label="Lectura" style={{ fontSize: 11 }}>{p.read}</td>
                <td data-label="Estado"><button className="status-toggle on"><span className="dot"></span>Publicado</button></td>
                <td className="muted mono" data-label="Fecha" style={{ fontSize: 11 }}>{p.date}</td>
                <td className="actions-cell">
                  <div className="row" style={{ gap: 4, justifyContent: 'flex-end' }}>
                    <button className="ic-btn">
                      <span aria-hidden="true">✏</span><span className="ic-btn-label">Editar</span>
                    </button>
                    <button className="ic-btn" data-variant="danger" style={{ color: 'var(--blood)' }}>
                      <span aria-hidden="true">×</span><span className="ic-btn-label">Eliminar</span>
                    </button>
                  </div>
                </td>
              </tr>
            )}
          </tbody>
        </table>
      </section>
    </>);

}

// ============ STORES ============
function AdminStores() {
  const stores = window.BK_DATA.STORES;
  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Físico</div>
          <h1>SUCURSALES</h1>
          <p className="muted" style={{ margin: '4px 0 0', fontSize: 14 }}>{stores.length} ubicaciones activas</p>
        </div>
        <button className="btn primary sm">+ Agregar sucursal</button>
      </header>
      <div className="grid-2 mt-24">
        {stores.map((s, i) =>
        <div key={i} className="admin-card">
            <div className="between">
              <div>
                <div className="eyebrow">SUCURSAL 0{i + 1}</div>
                <h3 style={{ margin: '4px 0 0' }}>{s.name.replace('BK MOTO ', '').toUpperCase()}</h3>
              </div>
              <button className="status-toggle on"><span className="dot"></span>Abierta</button>
            </div>
            <div style={{ marginTop: 14, display: 'grid', gap: 8, fontSize: 13 }}>
              <div className="row" style={{ gap: 8 }}>{Icon.pin()} <span>{s.addr}</span></div>
              <div className="row" style={{ gap: 8 }}>{Icon.phone()} <span>{s.tel}</span></div>
              <div className="muted mono" style={{ fontSize: 11, letterSpacing: '.14em' }}>● {s.hours}</div>
            </div>
            <div className="row mt-16" style={{ gap: 8 }}>
              <button className="btn ghost sm">Editar</button>
              <button className="btn ghost sm">Inventario local</button>
            </div>
          </div>
        )}
      </div>
    </>);

}

// ============ SETTINGS ============
function AdminSettings() {
  const [section, setSection] = useStateA('general');
  return (
    <>
      <header className="admin-page-head">
        <div>
          <div className="eyebrow">Sistema</div>
          <h1>CONFIGURACIÓN</h1>
        </div>
      </header>

      <div className="admin-tabs">
        {[['general', 'General'], ['shipping', 'Envíos'], ['payment', 'Pagos'], ['taxes', 'Impuestos'], ['email', 'Notificaciones']].map(([k, l]) =>
        <button key={k} className={`admin-tab ${section === k ? 'on' : ''}`} onClick={() => setSection(k)}>{l}</button>
        )}
      </div>

      <section className="admin-card" style={{ maxWidth: 760 }}>
        {section === 'general' &&
        <div style={{ display: 'grid', gap: 18 }}>
            <h3 style={{ margin: 0 }}>Información de la tienda</h3>
            <div><label className="field-label">Nombre de la tienda</label><input className="field" defaultValue="BK MOTO · Helmets and Parts" /></div>
            <div><label className="field-label">Email de soporte</label><input className="field" type="email" defaultValue="hola@bkmoto.mx" /></div>
            <div><label className="field-label">WhatsApp</label><input className="field" defaultValue="+52 55 1234 0023" /></div>
            <div className="grid-2">
              <div><label className="field-label">Moneda</label><select className="field" defaultValue="MXN"><option>MXN</option><option>USD</option></select></div>
              <div><label className="field-label">Zona horaria</label><select className="field" defaultValue="America/Mexico_City"><option>America/Mexico_City</option><option>America/Tijuana</option></select></div>
            </div>
            <button className="btn primary" style={{ justifySelf: 'start' }}>Guardar cambios</button>
          </div>
        }
        {section === 'shipping' &&
        <div style={{ display: 'grid', gap: 18 }}>
            <h3 style={{ margin: 0 }}>Tarifas de envío</h3>
            {[
          { name: 'Estándar (Estafeta)', days: '2-4 días', price: 199, free: '+$2,000' },
          { name: 'Express (DHL)', days: '1-2 días', price: 349, free: '—' },
          { name: 'Same day (CDMX)', days: '24h', price: 249, free: '—' },
          { name: 'Recoger en sucursal', days: '2h', price: 0, free: 'siempre' }].
          map((s, i) =>
          <div key={i} className="row" style={{ gap: 16, padding: '14px 0', borderBottom: '1px solid var(--line)' }}>
                <div style={{ flex: 1 }}>
                  <div style={{ fontWeight: 500 }}>{s.name}</div>
                  <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>{s.days} · Gratis {s.free}</div>
                </div>
                <input className="field" type="number" defaultValue={s.price} style={{ width: 120 }} />
                <button className="status-toggle on"><span className="dot"></span>Activo</button>
              </div>
          )}
          </div>
        }
        {section === 'payment' &&
        <div style={{ display: 'grid', gap: 14 }}>
            <h3 style={{ margin: 0 }}>Métodos de pago</h3>
            {[
          ['Mercado Pago', 'MP API v2 · saldo, OXXO, débito', '✓'],
          ['SPEI / Transferencia', 'CLABE · confirmación automática', '✓']].
          map(([n, d, on], i) =>
          <div key={i} className="row" style={{ gap: 16, padding: '14px 0', borderBottom: '1px solid var(--line)' }}>
                <div style={{ flex: 1 }}>
                  <div style={{ fontWeight: 500 }}>{n}</div>
                  <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>{d}</div>
                </div>
                <button className={`status-toggle ${on === '✓' ? 'on' : 'off'}`}><span className="dot"></span>{on === '✓' ? 'Activo' : 'Inactivo'}</button>
              </div>
          )}
          </div>
        }
        {section === 'taxes' &&
        <div style={{ display: 'grid', gap: 18 }}>
            <h3 style={{ margin: 0 }}>Impuestos</h3>
            <div className="grid-2">
              <div><label className="field-label">IVA (general)</label><input className="field" defaultValue="16%" /></div>
              <div><label className="field-label">IVA fronterizo</label><input className="field" defaultValue="8%" /></div>
            </div>
            <label className="checkbox"><input type="checkbox" defaultChecked /><span>Precios mostrados incluyen IVA</span></label>
            <label className="checkbox"><input type="checkbox" defaultChecked /><span>Emitir factura electrónica automáticamente</span></label>
          </div>
        }
        {section === 'email' &&
        <div style={{ display: 'grid', gap: 14 }}>
            <h3 style={{ margin: 0 }}>Notificaciones automáticas</h3>
            {[
          'Confirmación de pedido al cliente',
          'Pedido enviado · tracking',
          'Pedido entregado · invitación a reseñar',
          'Carrito abandonado · 1h después',
          'Carrito abandonado · 24h después',
          'Cupón de cumpleaños',
          'Newsletter mensual',
          'Alerta interna: stock bajo (< 5 unid.)',
          'Alerta interna: nuevo pedido +$10K'].
          map((n, i) =>
          <label key={i} className="between" style={{ padding: '12px 0', borderBottom: '1px solid var(--line)' }}>
                <span>{n}</span>
                <input type="checkbox" defaultChecked={i < 5 || i === 7 || i === 8} style={{ accentColor: 'var(--blood)', transform: 'scale(1.3)' }} />
              </label>
          )}
          </div>
        }
        {section === 'integrations' &&
        <div className="grid-2" style={{ gap: 14 }}>
            {[
          ['Google Analytics 4', 'Tracking · funnel', 'Conectado'],
          ['Meta Pixel', 'Ads · remarketing', 'Conectado'],
          ['Klaviyo', 'Email automation', 'Conectado'],
          ['Mailchimp', 'Newsletter', '—'],
          ['Sendcloud', 'Logística', 'Conectado'],
          ['Conekta', 'Pagos', 'Conectado'],
          ['SAT · Facturación', 'CFDI 4.0', 'Conectado'],
          ['Slack', 'Notificaciones internas', '—']].
          map(([n, d, s], i) =>
          <div key={i} style={{ padding: 16, border: '1px solid var(--line)' }}>
                <div className="between">
                  <div>
                    <div style={{ fontWeight: 500 }}>{n}</div>
                    <div className="mono" style={{ fontSize: 10, color: 'var(--text-muted)' }}>{d}</div>
                  </div>
                  <span className={`status-toggle ${s === '—' ? 'off' : 'on'}`}><span className="dot"></span>{s}</span>
                </div>
                <button className="btn ghost sm mt-16" style={{ width: '100%' }}>{s === '—' ? 'Conectar' : 'Configurar'}</button>
              </div>
          )}
          </div>
        }
      </section>
    </>);

}

Object.assign(window, { PageAdmin });