// ============================================================
// PRODUCTS INDEX — full filterable catalog
// Direction B aesthetic. Sidebar filters + grid/list toggle.
// ============================================================

function ProductsIndex({ onNavigate, params }) {
  const [view, setView] = React.useState('grid'); // grid | table
  const [cat, setCat] = React.useState(params?.cat ? mapCatSlug(params.cat) : 'all');
  const [app, setApp] = React.useState('all');
  const [purity, setPurity] = React.useState(99);
  const [search, setSearch] = React.useState('');
  const [sort, setSort] = React.useState('default');

  const filtered = PRODUCTS.filter(p => {
    if (cat !== 'all' && p.category !== cat) return false;
    if (app !== 'all') {
      const appName = APPLICATIONS.find(a => a.id === app)?.name || '';
      if (!p.market.toLowerCase().includes(appName.toLowerCase().split(' ')[0])) return false;
    }
    if (p.silica_pct < purity) return false;
    if (search && !`${p.name} ${p.sku} ${p.market}`.toLowerCase().includes(search.toLowerCase())) return false;
    return true;
  });

  const sorted = [...filtered].sort((a, b) => {
    if (sort === 'purity') return b.silica_pct - a.silica_pct;
    if (sort === 'iron') return a.iron_ppm - b.iron_ppm;
    return 0;
  });

  // Pad PRODUCTS for catalog feel — show some duplicates with grade variants
  const expanded = [
    ...sorted,
    ...sorted.map(p => ({ ...p, sku: p.sku + '-LO', name: p.name + ' (Low-Iron variant)', iron_ppm: Math.max(40, p.iron_ppm - 30) })).slice(0, 4),
    ...sorted.map(p => ({ ...p, sku: p.sku + '-HD', name: p.name + ' (High-Density variant)' })).slice(0, 4),
  ];

  return (
    <div className="dir-b ab-page">
      <BrowserChrome url="ussilica.com/products" />
      <NavB onNavigate={onNavigate} />
      <PageHeader title="Products" subtitle="38 grades across 5 categories." breadcrumbs={['Home', 'Products']} onNavigate={onNavigate} />

      <section style={{ padding: '0 32px 96px', background: 'var(--bg)' }}>
        <div style={{ display: 'grid', gridTemplateColumns: '280px 1fr', gap: 36, alignItems: 'start' }}>
          {/* Sidebar filters */}
          <aside style={{ position: 'sticky', top: 76, padding: '24px 0' }}>
            <div className="label-mono" style={{ marginBottom: 12 }}>SEARCH</div>
            <div style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '10px 12px', background: 'var(--paper)', border: '1px solid var(--line)', borderRadius: 8 }}>
              <Icon.search size={14}/>
              <input value={search} onChange={e => setSearch(e.target.value)} placeholder="Name, SKU, market"
                style={{ background: 'transparent', border: 0, outline: 'none', fontSize: 13, flex: 1, color: 'var(--ink)' }}/>
            </div>

            <FilterGroup label="CATEGORY" value={cat} onChange={setCat} options={[
              ['all', 'All categories', 38],
              ['Whole Grain', 'Whole Grain', 12],
              ['Ground Silica', 'Ground Silica', 9],
              ['Micronized', 'Micronized', 6],
              ['Proppant', 'Proppants', 5],
              ['Specialty', 'Specialty', 6],
            ]} />

            <FilterGroup label="APPLICATION" value={app} onChange={setApp} options={[
              ['all', 'All applications'],
              ...APPLICATIONS.map(a => [a.id, a.name, a.count]),
            ]} />

            <div style={{ marginTop: 24 }}>
              <label className="label-mono" style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 10 }}>
                <span>MIN. SiO₂ PURITY</span>
                <span className="mono" style={{ color: 'var(--accent)' }}>≥ {purity.toFixed(1)}%</span>
              </label>
              <input type="range" min="98" max="99.9" step="0.1" value={purity}
                onChange={e => setPurity(+e.target.value)}
                style={{ width: '100%', accentColor: 'oklch(0.48 0.18 252)' }}/>
            </div>

            <div style={{ marginTop: 28, padding: 16, background: 'var(--accent-soft)', borderRadius: 10 }}>
              <div className="label-mono" style={{ color: 'var(--accent)' }}>NEED HELP?</div>
              <div style={{ fontSize: 13, marginTop: 6, lineHeight: 1.45 }}>
                Tell us your application and target chemistry — we'll propose candidates.
              </div>
              <button onClick={() => onNavigate('rfq')} style={{ marginTop: 10, padding: '8px 12px', background: 'var(--accent)', color: '#fff', border: 0, borderRadius: 5, fontSize: 12, fontWeight: 500, cursor: 'pointer', fontFamily: 'IBM Plex Sans' }}>
                Start a quote
              </button>
            </div>
          </aside>

          {/* Results */}
          <div style={{ padding: '24px 0' }}>
            <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 18 }}>
              <div className="mono" style={{ fontSize: 12, color: 'var(--ink-soft)' }}>
                Showing <strong style={{ color: 'var(--ink)' }}>{expanded.length}</strong> of {PRODUCTS.length + 8} grades
              </div>
              <div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
                <div className="mono" style={{ fontSize: 11, color: 'var(--ink-soft)' }}>SORT</div>
                <select value={sort} onChange={e => setSort(e.target.value)} style={{ padding: '6px 10px', border: '1px solid var(--line)', borderRadius: 5, fontSize: 12, fontFamily: 'IBM Plex Sans', background: 'var(--paper)' }}>
                  <option value="default">Featured</option>
                  <option value="purity">Highest purity</option>
                  <option value="iron">Lowest iron</option>
                </select>
                <div style={{ display: 'flex', background: 'var(--paper)', border: '1px solid var(--line)', borderRadius: 6, overflow: 'hidden' }}>
                  <button onClick={() => setView('grid')} style={{ padding: '6px 10px', background: view === 'grid' ? 'var(--accent)' : 'transparent', color: view === 'grid' ? '#fff' : 'var(--ink-soft)', border: 0, cursor: 'pointer', fontSize: 11, fontFamily: 'IBM Plex Mono' }}>Grid</button>
                  <button onClick={() => setView('table')} style={{ padding: '6px 10px', background: view === 'table' ? 'var(--accent)' : 'transparent', color: view === 'table' ? '#fff' : 'var(--ink-soft)', border: 0, cursor: 'pointer', fontSize: 11, fontFamily: 'IBM Plex Mono' }}>Table</button>
                </div>
              </div>
            </div>

            {view === 'grid' ? <ProductGrid products={expanded} onNavigate={onNavigate}/> : <ProductTable products={expanded} onNavigate={onNavigate}/>}
          </div>
        </div>
      </section>

      <CtaB onNavigate={onNavigate}/>
      <FooterB onNavigate={onNavigate}/>
    </div>
  );
}

function mapCatSlug(slug) {
  return ({ 'whole-grain': 'Whole Grain', 'ground': 'Ground Silica', 'micronized': 'Micronized', 'proppants': 'Proppant', 'specialty': 'Specialty' })[slug] || 'all';
}

function FilterGroup({ label, value, onChange, options }) {
  return (
    <div style={{ marginTop: 24 }}>
      <div className="label-mono" style={{ marginBottom: 10 }}>{label}</div>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
        {options.map(([v, l, count]) => (
          <button key={v} onClick={() => onChange(v)} style={{
            background: value === v ? 'var(--accent-soft)' : 'transparent',
            border: 0, padding: '7px 10px', borderRadius: 6, cursor: 'pointer',
            display: 'flex', justifyContent: 'space-between', alignItems: 'center',
            fontSize: 13, color: value === v ? 'var(--accent)' : 'var(--ink)',
            fontWeight: value === v ? 500 : 400, textAlign: 'left',
          }}>
            <span>{l}</span>
            {count !== undefined && <span className="mono" style={{ fontSize: 11, color: value === v ? 'var(--accent)' : 'var(--ink-soft)' }}>{count}</span>}
          </button>
        ))}
      </div>
    </div>
  );
}

function ProductGrid({ products, onNavigate }) {
  return (
    <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 18 }}>
      {products.map((p, i) => (
        <article key={p.sku + i} onClick={() => onNavigate('product', { sku: p.sku })} style={{
          background: 'var(--paper)', border: '1px solid var(--line)', borderRadius: 10, overflow: 'hidden',
          cursor: 'pointer', transition: 'transform .15s, box-shadow .15s',
        }}
        onMouseEnter={(e) => { e.currentTarget.style.transform = 'translateY(-2px)'; e.currentTarget.style.boxShadow = '0 16px 30px rgba(10,10,10,0.06)'; }}
        onMouseLeave={(e) => { e.currentTarget.style.transform = 'translateY(0)'; e.currentTarget.style.boxShadow = 'none'; }}>
          <div style={{ position: 'relative' }}>
            <Photo src={p.image} height={180}/>
            <span style={{ position: 'absolute', top: 12, left: 12, padding: '4px 8px', background: 'rgba(10,10,10,0.7)', color: '#fff', borderRadius: 4, fontFamily: 'IBM Plex Mono', fontSize: 10, letterSpacing: '0.06em' }}>
              {p.sku}
            </span>
          </div>
          <div style={{ padding: 16 }}>
            <div className="label-mono" style={{ color: 'var(--accent)' }}>{p.category.toUpperCase()}</div>
            <h3 style={{ fontSize: 16, margin: '8px 0 4px', fontWeight: 500, lineHeight: 1.25 }}>{p.name}</h3>
            <div style={{ fontSize: 12, color: 'var(--ink-soft)' }}>{p.market}</div>
            <div style={{ marginTop: 14, display: 'flex', gap: 14, fontFamily: 'IBM Plex Mono', fontSize: 11, color: 'var(--ink-soft)' }}>
              <span><span style={{ color: 'var(--accent)' }}>{p.silica_pct}%</span> SiO₂</span>
              <span>{p.mesh}</span>
              <span>{p.iron_ppm} ppm Fe</span>
            </div>
          </div>
        </article>
      ))}
    </div>
  );
}

function ProductTable({ products, onNavigate }) {
  return (
    <div style={{ background: 'var(--paper)', border: '1px solid var(--line)', borderRadius: 10, overflow: 'hidden' }}>
      <div className="mono" style={{ display: 'grid', gridTemplateColumns: '50px 90px 2fr 1.2fr 1.2fr 90px 100px 90px 40px', gap: 14, padding: '12px 18px', borderBottom: '1px solid var(--line)', fontSize: 11, color: 'var(--ink-soft)', textTransform: 'uppercase' }}>
        <span></span><span>SKU</span><span>Product</span><span>Category</span><span>Markets</span><span>Mesh</span><span>SiO₂</span><span>Iron</span><span></span>
      </div>
      {products.map((p, i) => (
        <div key={p.sku + i} onClick={() => onNavigate('product', { sku: p.sku })}
          style={{
            display: 'grid', gridTemplateColumns: '50px 90px 2fr 1.2fr 1.2fr 90px 100px 90px 40px',
            gap: 14, padding: '14px 18px', borderBottom: i < products.length - 1 ? '1px solid var(--line)' : 'none',
            alignItems: 'center', cursor: 'pointer',
          }}
          onMouseEnter={(e) => e.currentTarget.style.background = 'oklch(0.97 0 0)'}
          onMouseLeave={(e) => e.currentTarget.style.background = 'transparent'}>
          <div style={{ width: 38, height: 38, borderRadius: 5, overflow: 'hidden', background: '#000' }}>
            <Photo src={p.image} height={38}/>
          </div>
          <span className="mono" style={{ fontSize: 12, color: 'var(--accent)' }}>{p.sku}</span>
          <span style={{ fontSize: 14, fontWeight: 500 }}>{p.name}</span>
          <span style={{ fontSize: 13, color: 'var(--ink-soft)' }}>{p.category}</span>
          <span style={{ fontSize: 13, color: 'var(--ink-soft)' }}>{p.market}</span>
          <span className="mono" style={{ fontSize: 12 }}>{p.mesh}</span>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
            <div style={{ width: 42, height: 3, background: 'var(--line)', borderRadius: 2 }}>
              <div style={{ width: `${(p.silica_pct - 99) * 200}%`, height: '100%', background: 'var(--accent)' }}/>
            </div>
            <span className="mono" style={{ fontSize: 12 }}>{p.silica_pct}%</span>
          </div>
          <span className="mono" style={{ fontSize: 12 }}>{p.iron_ppm} ppm</span>
          <Icon.arrow size={13}/>
        </div>
      ))}
    </div>
  );
}

// ============================================================
// PAGE HEADER — shared lockup for non-home pages
// ============================================================
function PageHeader({ title, subtitle, breadcrumbs, onNavigate, eyebrow, dark, cover, height }) {
  if (dark || cover) {
    return (
      <section style={{ position: 'relative', minHeight: height || 420, overflow: 'hidden', background: 'var(--bg-deep)', color: 'var(--paper)' }}>
        {cover && <img src={cover} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover', opacity: 0.4 }} />}
        <div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(180deg, rgba(10,10,10,0.4), rgba(10,10,10,0.8))' }}/>
        <div style={{ position: 'relative', padding: '64px 32px 56px' }}>
          {breadcrumbs && (
            <nav className="mono" style={{ fontSize: 11, color: 'rgba(255,255,255,0.55)' }}>
              {breadcrumbs.map((b, i) => (
                <React.Fragment key={i}>
                  <span style={{ cursor: 'pointer' }} onClick={() => i === 0 && onNavigate?.('home')}>{b}</span>
                  {i < breadcrumbs.length - 1 && <span style={{ margin: '0 8px' }}>›</span>}
                </React.Fragment>
              ))}
            </nav>
          )}
          {eyebrow && <div className="label-mono" style={{ marginTop: 18, color: 'oklch(0.78 0.13 70)' }}>{eyebrow}</div>}
          <h1 className="display" style={{ fontSize: 80, margin: '20px 0 16px', color: 'var(--paper)', maxWidth: 1200, fontWeight: 500 }}>{title}</h1>
          {subtitle && <p style={{ marginTop: 0, fontSize: 19, color: 'rgba(255,255,255,0.8)', maxWidth: 720, lineHeight: 1.5 }}>{subtitle}</p>}
        </div>
      </section>
    );
  }
  return (
    <section style={{ padding: '56px 32px 32px', background: 'var(--paper)', borderBottom: '1px solid var(--line)' }}>
      {breadcrumbs && (
        <nav className="mono" style={{ fontSize: 11, color: 'var(--ink-soft)', marginBottom: 22 }}>
          {breadcrumbs.map((b, i) => (
            <React.Fragment key={i}>
              <span style={{ cursor: 'pointer' }} onClick={() => i === 0 && onNavigate?.('home')}>{b}</span>
              {i < breadcrumbs.length - 1 && <span style={{ margin: '0 8px' }}>›</span>}
            </React.Fragment>
          ))}
        </nav>
      )}
      {eyebrow && <div className="label-mono" style={{ marginBottom: 12 }}>{eyebrow}</div>}
      <h1 className="display" style={{ fontSize: 64, margin: 0, fontWeight: 500 }}>{title}</h1>
      {subtitle && <p style={{ marginTop: 12, fontSize: 17, color: 'var(--ink-soft)', maxWidth: 760, lineHeight: 1.5 }}>{subtitle}</p>}
    </section>
  );
}

Object.assign(window, { ProductsIndex, PageHeader });
