// ProductDetail.jsx, Product detail page (PDP) anchored on tiered volume pricing.

const ProductDetailPage = ({ onNavigate, onRFQ, productId = "p01" }) => {
 const vp = useViewport();
 const product = PRODUCTS.find(p => p.id === productId) || PRODUCTS[0];
 const supplier = SUPPLIERS.find(s => s.id === product.supplier);

 const priceModel = derivePricing(product);
 const tiers = priceModel.tiers;

 const [qty, setQty] = useState(2000);
 const [tab, setTab] = useState("specs");

 const activeTier = pickTier(tiers, qty);
 const subtotal = qty * activeTier.unit;
 const savingsVsTier1 = qty * (tiers[0].unit - activeTier.unit);

 const otherProducts = PRODUCTS
  .filter(p => p.supplier === product.supplier && p.id !== product.id)
  .slice(0, 4);

 const heroCols = vp.isWide ? "560px 1fr" : (vp.isDesktop ? "440px 1fr" : "1fr");
 const calcCols = vp.isDesktop ? "1.6fr 1fr" : "1fr";
 const tabContentCols = vp.isDesktop ? "1fr 320px" : "1fr";

 return (
  <div>
   {/* ============================================================ HERO */}
   <section style={{ borderBottom: "1px solid var(--color-border)", background: "#fff" }}>
    <div style={{ maxWidth: 1280, margin: "0 auto", padding: "20px var(--pad-x) 0" }}>
     <div style={{ fontSize: 12, color: "var(--color-fg-muted)", display: "flex", gap: 6, flexWrap: "wrap" }}>
      <a href="#" onClick={e => { e.preventDefault(); onNavigate("home"); }} style={{ color: "var(--color-fg-muted)", border: 0 }}>Home</a>
      <span>/</span>
      <a href="#" onClick={e => { e.preventDefault(); onNavigate("products"); }} style={{ color: "var(--color-fg-muted)", border: 0 }}>Products</a>
      <span>/</span>
      <a href="#" onClick={e => { e.preventDefault(); onNavigate("products"); }} style={{ color: "var(--color-fg-muted)", border: 0 }}>{categoryLabel(product.category)}</a>
      <span>/</span>
      <span style={{ color: "var(--color-fg)" }}>{product.name}</span>
     </div>
    </div>

    <div style={{ maxWidth: 1280, margin: "0 auto", padding: "28px var(--pad-x) 40px", display: "grid", gridTemplateColumns: heroCols, gap: vp.isWide ? 56 : 32, alignItems: "flex-start" }}>
     <Gallery product={product}/>

     <div style={{ minWidth: 0 }}>
      <div style={{ display: "flex", gap: 8, alignItems: "center", marginBottom: 10, flexWrap: "wrap" }}>
       <CountryChip country={product.origin}/>
       <span style={{ width: 4, height: 4, background: "var(--color-fg-muted)", borderRadius: 999, opacity: 0.4 }}/>
       <span style={{ fontSize: 12, color: "var(--color-fg-muted)" }}>HS <Mono style={{ color: "var(--color-fg)" }}>{priceModel.hs}</Mono></span>
       <span style={{ width: 4, height: 4, background: "var(--color-fg-muted)", borderRadius: 999, opacity: 0.4 }}/>
       <span style={{ fontSize: 12, color: "var(--color-fg-muted)" }}>SKU <Mono style={{ color: "var(--color-fg)" }}>{product.id.toUpperCase()}-{priceModel.pack.replace(/\W+/g,"")}</Mono></span>
      </div>

      <h1 style={{ fontSize: vp.isMobile ? 24 : 32, lineHeight: 1.15, letterSpacing: "-0.015em", color: "var(--jv-navy-800)", marginBottom: 18 }}>{product.name}</h1>

      <div style={{ display: "flex", alignItems: "center", gap: 12, padding: "12px 14px", border: "1px solid var(--color-border)", borderRadius: 6, marginBottom: 20, background: "var(--color-bg-soft)", flexWrap: "wrap" }}>
       <div style={{ width: 40, height: 40, borderRadius: 6, background: "#fff", border: "1px solid var(--color-border)", display: "flex", alignItems: "center", justifyContent: "center", fontWeight: 700, color: "var(--jv-navy-800)", fontSize: 13, flexShrink: 0 }}>{supplier.initials}</div>
       <div style={{ flex: 1, minWidth: 0 }}>
        <a href="#" onClick={e => { e.preventDefault(); onNavigate("profile", supplier.id); }}
         style={{ display: "block", fontSize: 14, fontWeight: 500, color: "var(--jv-navy-800)", border: 0, textDecoration: "none" }}>
         {supplier.name}
        </a>
        <div style={{ fontSize: 12, color: "var(--color-fg-muted)" }}>
         {supplier.city}, {supplier.country === "vn" ? "Vietnam" : "Japan"} · Est. {supplier.established} · Direct trader
        </div>
       </div>
       <div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
        {supplier.verified && <StatusPill tone="trust">Verified</StatusPill>}
        {supplier.audited && <StatusPill tone="neutral">Audited</StatusPill>}
       </div>
      </div>

      {/* Key spec strip — 4 cells on wide, 2x2 on mobile */}
      <div style={{ display: "grid", gridTemplateColumns: vp.isMobile ? "1fr 1fr" : "repeat(4, 1fr)", gap: 0, border: "1px solid var(--color-border)", borderRadius: 6, overflow: "hidden", marginBottom: 20 }}>
       {[
        { label: "MOQ", value: priceModel.moq },
        { label: "Lead time", value: supplier.leadTime },
        { label: "FOB port", value: supplier.country === "vn" ? "Hai Phong" : "Yokohama" },
        { label: "Pack", value: priceModel.pack },
       ].map((k, i) => {
        const isMobile2x2 = vp.isMobile;
        const borderLeft = isMobile2x2 ? (i % 2 ? "1px solid var(--color-divider)" : 0) : (i ? "1px solid var(--color-divider)" : 0);
        const borderTop = isMobile2x2 && i >= 2 ? "1px solid var(--color-divider)" : 0;
        return (
         <div key={k.label} style={{ padding: "12px 14px", borderLeft, borderTop }}>
          <div style={{ fontSize: 10, color: "var(--color-fg-muted)", textTransform: "uppercase", letterSpacing: "0.07em", fontWeight: 600, marginBottom: 4 }}>{k.label}</div>
          <Mono style={{ fontSize: 14, color: "var(--jv-navy-800)" }}>{k.value}</Mono>
         </div>
        );
       })}
      </div>

      <div style={{ marginBottom: 24 }}>
       <Eyebrow style={{ marginBottom: 8 }}>Certifications on file</Eyebrow>
       <div style={{ display: "flex", gap: 8, flexWrap: "wrap" }}>
        {product.certs.map(c => (
         <span key={c} style={{ display: "inline-flex", alignItems: "center", gap: 6, padding: "5px 10px", border: "1px solid var(--color-border)", borderRadius: 4, fontSize: 12 }}>
          <Icon name="shield-check" size={14} color="var(--jv-trust-600)"/>
          <Mono style={{ color: "var(--jv-navy-800)" }}>{c}</Mono>
         </span>
        ))}
        <span style={{ display: "inline-flex", alignItems: "center", gap: 6, padding: "5px 10px", border: "1px solid var(--color-border)", borderRadius: 4, fontSize: 12 }}>
         <Icon name="shield-check" size={14} color="var(--jv-trust-600)"/>
         <Mono style={{ color: "var(--jv-navy-800)" }}>FDA reg.</Mono>
        </span>
       </div>
      </div>

      <p style={{ fontSize: 14, lineHeight: 1.6, color: "var(--color-fg-body)" }}>{priceModel.description}</p>
     </div>

    </div>
   </section>

   {/* ============================================================ PRICE BREAKDOWN */}
   <section id="pricing" style={{ background: "var(--jv-sand-100)", borderBottom: "1px solid var(--color-border)" }}>
    <div style={{ maxWidth: 1280, margin: "0 auto", padding: vp.isMobile ? "40px var(--pad-x)" : "56px var(--pad-x)" }}>
     <div style={{ display: "grid", gridTemplateColumns: vp.isDesktop ? "1fr 1fr" : "1fr", gap: vp.isWide ? 56 : 32, alignItems: "flex-start", marginBottom: 32 }}>
      <div>
       <Eyebrow>Volume pricing</Eyebrow>
       <h2 style={{ fontSize: vp.isMobile ? 22 : 28, lineHeight: 1.2, letterSpacing: "-0.015em", color: "var(--jv-navy-800)", marginTop: 8 }}>
        Order more, pay less per {priceModel.unit}.
       </h2>
       <p style={{ marginTop: 10, fontSize: 14, lineHeight: 1.55, color: "var(--color-fg-body)", maxWidth: 540 }}>
        Indicative FOB {supplier.country === "vn" ? "Hai Phong" : "Yokohama"} pricing for the standard pack. Tier prices are confirmed in your RFQ, incoterm, payment terms and certifications adjust the final quote.
       </p>
      </div>
      <div style={{ display: "flex", gap: 8, alignItems: "flex-start", padding: "12px 14px", background: "#fff", border: "1px solid var(--jv-sand-300)", borderRadius: 6, fontSize: 13, color: "var(--color-fg-body)", maxWidth: 460, justifySelf: vp.isDesktop ? "end" : "stretch" }}>
       <Icon name="shield-check" size={16} color="var(--jv-trust-600)"/>
       <span><strong style={{ color: "var(--jv-navy-800)" }}>Verified price.</strong> JVFood reviews this supplier's price list quarterly and flags movement greater than ±5%.<br/>Last reviewed <Mono>2026-04-12</Mono>.</span>
      </div>
     </div>

     {/* Tier ladder */}
     <TierLadder tiers={tiers} priceModel={priceModel} activeTierId={activeTier.id} onPickQty={setQty} vp={vp}/>

     {/* Calculator + landed estimate */}
     <div style={{ marginTop: 28, display: "grid", gridTemplateColumns: calcCols, gap: 20, alignItems: "stretch" }}>
      <LotCalculator
       tiers={tiers}
       priceModel={priceModel}
       qty={qty}
       setQty={setQty}
       activeTier={activeTier}
       subtotal={subtotal}
       savings={savingsVsTier1}
       onRFQ={onRFQ}
       supplier={supplier}
       vp={vp}
      />
      <PaymentOptions priceModel={priceModel} subtotal={subtotal}/>
     </div>
    </div>
   </section>

   {/* ============================================================ TAB STRIP */}
   <section style={{ borderBottom: "1px solid var(--color-border)", background: "#fff", position: "sticky", top: 64, zIndex: 10 }}>
    <div style={{ maxWidth: 1280, margin: "0 auto", padding: "0 var(--pad-x)" }}>
     <div className="jv-tabs-scroll" style={{ display: "flex", gap: vp.isMobile ? 20 : 28 }}>
      {[
       { id: "specs", label: "Product specs" },
       { id: "packing", label: "Packing & lots" },
       { id: "logistics", label: "Logistics" },
       { id: "compliance", label: "Compliance" },
       { id: "supplier", label: "Supplier" },
      ].map(t => (
       <button key={t.id} onClick={() => setTab(t.id)}
        style={{ background: "transparent", border: 0, padding: "16px 0", fontSize: 14, fontFamily: "var(--font-sans)",
         color: tab === t.id ? "var(--jv-navy-800)" : "var(--color-fg-body)",
         fontWeight: tab === t.id ? 500 : 400,
         borderBottom: tab === t.id ? "2px solid var(--jv-navy-800)" : "2px solid transparent",
         cursor: "pointer", whiteSpace: "nowrap" }}>{t.label}</button>
      ))}
     </div>
    </div>
   </section>

   <section style={{ background: "#fff", padding: vp.isMobile ? "32px var(--pad-x) 16px" : "48px var(--pad-x) 16px" }}>
    <div style={{ maxWidth: 1280, margin: "0 auto", display: "grid", gridTemplateColumns: tabContentCols, gap: vp.isWide ? 48 : 32 }}>
     <div style={{ display: "flex", flexDirection: "column", gap: 40, minWidth: 0 }}>
      {tab === "specs" && <SpecsTab priceModel={priceModel} vp={vp}/>}
      {tab === "packing" && <PackingTab priceModel={priceModel} tiers={tiers} vp={vp}/>}
      {tab === "logistics" && <LogisticsTab supplier={supplier} priceModel={priceModel} vp={vp}/>}
      {tab === "compliance" && <ComplianceTab certs={product.certs} vp={vp}/>}
      {tab === "supplier" && <SupplierMini supplier={supplier} onNavigate={onNavigate} vp={vp}/>}
     </div>

     <aside style={{ display: "flex", flexDirection: "column", gap: 20, minWidth: 0 }}>
      <FactCardP label="Origin">
       <div style={{ display: "flex", alignItems: "center", gap: 10, marginBottom: 10 }}>
        <img src={`assets/flag-${product.origin}.svg`} width="22" height="16" alt={product.origin}/>
        <div>
         <div style={{ fontSize: 14, color: "var(--jv-navy-800)", fontWeight: 500 }}>{supplier.city}, {product.origin === "vn" ? "Vietnam" : "Japan"}</div>
        </div>
       </div>
       <div style={{ fontSize: 12, color: "var(--color-fg-body)", lineHeight: 1.6 }}>
        Catch / harvest area <Mono>{priceModel.harvest}</Mono>. Processed at <Mono>BRC-audited</Mono> facility.
       </div>
      </FactCardP>

      <FactCardP label="Typical trade lane">
       {[
        { from: "vn", to: "jp", port: "Hai Phong → Yokohama", days: "10–12 d" },
        { from: "vn", to: "jp", port: "Cat Lai → Kobe", days: "11–13 d" },
        { from: "vn", to: "jp", port: "Da Nang → Osaka", days: "9–11 d" },
       ].map((l, i) => (
        <div key={i} style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 10, padding: "8px 0", borderTop: i ? "1px solid var(--color-divider)" : 0, fontSize: 13 }}>
         <span style={{ display: "flex", alignItems: "center", gap: 8, minWidth: 0 }}>
          <img src={`assets/flag-${l.from}.svg`} width="16" height="12"/>
          <Icon name="arrow-right" size={12} color="var(--color-fg-muted)"/>
          <img src={`assets/flag-${l.to}.svg`} width="16" height="12"/>
          <span style={{ color: "var(--color-fg-body)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{l.port}</span>
         </span>
         <Mono style={{ fontSize: 12, color: "var(--color-fg-muted)", flexShrink: 0 }}>{l.days}</Mono>
        </div>
       ))}
      </FactCardP>

      <FactCardP label="Compare with">
       <div style={{ display: "flex", flexDirection: "column", gap: 8, fontSize: 13 }}>
        {PRODUCTS.filter(p => p.category === product.category && p.id !== product.id).slice(0, 3).map(p => (
         <a key={p.id} href="#" onClick={e => { e.preventDefault(); }} style={{ display: "flex", justifyContent: "space-between", alignItems: "center", color: "var(--color-fg-body)", border: 0, padding: "4px 0", gap: 8 }}>
          <span style={{ flex: 1, overflow: "hidden", whiteSpace: "nowrap", textOverflow: "ellipsis", minWidth: 0 }}>{p.name}</span>
          <Mono style={{ fontSize: 11, color: "var(--jv-navy-800)", flexShrink: 0 }}>{p.price}</Mono>
         </a>
        ))}
       </div>
      </FactCardP>
     </aside>
    </div>
   </section>

   {/* ============================================================ MORE FROM SUPPLIER */}
   <section style={{ background: "var(--color-bg-soft)", borderTop: "1px solid var(--color-border)", padding: vp.isMobile ? "40px var(--pad-x)" : "48px var(--pad-x)" }}>
    <div style={{ maxWidth: 1280, margin: "0 auto" }}>
     <div style={{ display: "flex", alignItems: "flex-end", justifyContent: "space-between", marginBottom: 20, gap: 16, flexWrap: "wrap" }}>
      <div>
       <Eyebrow>More from this supplier</Eyebrow>
       <h2 style={{ marginTop: 6, fontSize: vp.isMobile ? 20 : 22, color: "var(--jv-navy-800)" }}>Other products from {supplier.name}</h2>
      </div>
      <a href="#" onClick={e => { e.preventDefault(); onNavigate("profile", supplier.id); }} style={{ fontSize: 13, color: "var(--jv-navy-800)", border: 0, borderBottom: "1px solid var(--color-border)", paddingBottom: 2 }}>View full catalog →</a>
     </div>
     <div style={{ display: "grid", gridTemplateColumns: vp.isMobile ? "repeat(2, 1fr)" : "repeat(auto-fill, minmax(220px, 1fr))", gap: vp.isMobile ? 12 : 16 }}>
      {(otherProducts.length ? otherProducts : PRODUCTS.slice(1, 5)).map(p => (
       <MiniProductCard key={p.id} product={p} onNavigate={onNavigate}/>
      ))}
     </div>
    </div>
   </section>
  </div>
 );
};

// =============================================================================
function derivePricing(p) {
 const m = p.price.match(/(\w{3})\s+([\d\s,.]+)\s*\/\s*(\w+)/);
 const currency = m ? m[1] : "USD";
 const baseStr = m ? m[2].replace(/[\s,]/g, "") : "0";
 const base = parseFloat(baseStr);
 const unit = m ? (m[3] === "u" ? "unit" : m[3]) : "kg";
 const moqStr = p.moq;
 const moqQty = parseMoq(moqStr);
 const k = moqQty;
 const tierDefs = [
  { id: "t1", lo: k, hi: k * 2, mult: 1.05, label: "Starter" },
  { id: "t2", lo: k * 2, hi: k * 10, mult: 1.00, label: "Standard" },
  { id: "t3", lo: k * 10, hi: k * 40, mult: 0.92, label: "Volume" },
  { id: "t4", lo: k * 40, hi: Infinity, mult: 0.84, label: "Container" },
 ];
 const tiers = tierDefs.map(t => ({
  ...t,
  unit: round(base * t.mult, currency),
  savings: Math.round((1 - t.mult) * 100),
 }));
 return {
  currency, unit, base, tiers,
  hs: hsForCategory(p.category),
  pack: packForProduct(p),
  nameJa: jaName(p),
  description: descFor(p),
  harvest: harvestFor(p),
  moq: p.moq,
  moqQty,
 };
}
function parseMoq(s) {
 if (!s) return 500;
 const m = s.match(/([\d.]+)\s*(t|kg|u)/i);
 if (!m) return 500;
 const n = parseFloat(m[1]);
 return m[2].toLowerCase() === "t" ? n * 1000 : n;
}
function round(v, cur) {
 if (cur === "JPY") return Math.round(v / 10) * 10;
 return Math.round(v * 100) / 100;
}
function pickTier(tiers, qty) {
 for (let i = tiers.length - 1; i >= 0; i--) {
  if (qty >= tiers[i].lo) return tiers[i];
 }
 return tiers[0];
}
function formatMoney(v, cur) {
 if (cur === "JPY") return `JPY ${Math.round(v).toLocaleString("en-US")}`;
 return `USD ${v.toFixed(2)}`;
}
function formatTierUnit(v, cur) {
 if (cur === "JPY") return Math.round(v).toLocaleString("en-US");
 return v.toFixed(2);
}
function formatRange(lo, hi, unit) {
 const fmt = (n) => {
  if (n === Infinity) return "+";
  if (unit === "kg" && n >= 1000) return `${(n / 1000).toLocaleString("en-US", { maximumFractionDigits: 1 })} t`;
  return `${n.toLocaleString("en-US")} ${unit === "unit" ? "u" : unit}`;
 };
 if (hi === Infinity) return `${fmt(lo)}+`;
 return `${fmt(lo)} – ${fmt(hi)}`;
}
function formatQty(n, unit) {
 if (unit === "kg" && n >= 1000) return `${(n / 1000).toLocaleString("en-US", { maximumFractionDigits: n % 1000 === 0 ? 0 : 1 })} t`;
 return `${Math.round(n).toLocaleString("en-US")} ${unit === "unit" ? "u" : unit}`;
}

// =============================================================================
// TIER LADDER — 4 cols desktop, 2x2 grid on mobile
// =============================================================================
const TierLadder = ({ tiers, priceModel, activeTierId, onPickQty, vp }) => {
 const cols = vp.isMobile ? "1fr 1fr" : "repeat(4, 1fr)";
 return (
  <div style={{ background: "#fff", border: "1px solid var(--color-border)", borderRadius: 10, overflow: "hidden" }}>
   <div style={{ display: "grid", gridTemplateColumns: cols }}>
    {tiers.map((t, i) => {
     const active = t.id === activeTierId;
     const discount = t.mult < 1 ? Math.round((1 - t.mult) * 100) : null;
     const premium = t.mult > 1 ? Math.round((t.mult - 1) * 100) : null;
     const isMobile2x2 = vp.isMobile;
     const borderLeft = isMobile2x2 ? (i % 2 ? "1px solid var(--color-divider)" : 0) : (i ? "1px solid var(--color-divider)" : 0);
     const borderTop = isMobile2x2 && i >= 2 ? "1px solid var(--color-divider)" : 0;
     return (
      <button
       key={t.id}
       onClick={() => onPickQty(Math.min(t.lo + (t.hi === Infinity ? priceModel.moqQty * 20 : (t.hi - t.lo) / 2), 999999))}
       style={{
        textAlign: "left", padding: vp.isMobile ? "18px 18px 16px" : "24px 24px 22px",
        border: 0,
        borderLeft, borderTop,
        background: active ? "var(--jv-navy-800)" : "#fff",
        color: active ? "#fff" : "var(--jv-navy-800)",
        cursor: "pointer", position: "relative",
        transition: "background 200ms var(--ease-standard), color 200ms var(--ease-standard)",
        fontFamily: "var(--font-sans)",
       }}
      >
       <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 10, gap: 8, flexWrap: "wrap" }}>
        <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
         <span style={{ fontSize: 11, fontFamily: "var(--font-mono)", fontWeight: 600, letterSpacing: "0.08em", color: active ? "rgba(255,255,255,0.6)" : "var(--color-fg-muted)" }}>TIER {i + 1}</span>
         <span style={{ fontSize: 13, fontWeight: 500, color: active ? "#fff" : "var(--color-fg)" }}>{t.label}</span>
        </div>
        {active && (
         <span style={{ display: "inline-flex", alignItems: "center", gap: 4, padding: "2px 7px", background: "rgba(255,255,255,0.14)", borderRadius: 999, fontSize: 10, letterSpacing: "0.06em", textTransform: "uppercase" }}>
          <Icon name="check" size={11} color="#fff"/>Active
         </span>
        )}
       </div>

       <div style={{ fontSize: 12, color: active ? "rgba(255,255,255,0.7)" : "var(--color-fg-muted)", marginBottom: 14, fontFamily: "var(--font-mono)" }}>
        {formatRange(t.lo, t.hi, priceModel.unit)}
       </div>

       <div style={{ display: "flex", alignItems: "baseline", gap: 6, flexWrap: "wrap" }}>
        <span style={{ fontSize: 11, fontFamily: "var(--font-mono)", color: active ? "rgba(255,255,255,0.7)" : "var(--color-fg-muted)" }}>{priceModel.currency}</span>
        <span style={{ fontSize: vp.isMobile ? 24 : 30, fontFamily: "var(--font-mono)", fontWeight: 600, lineHeight: 1, letterSpacing: "-0.01em" }}>{formatTierUnit(t.unit, priceModel.currency)}</span>
        <span style={{ fontSize: 12, color: active ? "rgba(255,255,255,0.7)" : "var(--color-fg-muted)" }}>/ {priceModel.unit}</span>
       </div>

       <div style={{ marginTop: 14 }}>
        {discount ? (
         <span style={{
          display: "inline-flex", alignItems: "center", gap: 5,
          padding: "3px 9px", borderRadius: 999, fontSize: 11, fontWeight: 600, fontFamily: "var(--font-mono)",
          background: active ? "rgba(15,122,74,0.25)" : "var(--jv-trust-50)",
          color: active ? "#7ce0aa" : "var(--jv-trust-700)",
          border: `1px solid ${active ? "rgba(124,224,170,0.3)" : "var(--jv-trust-100)"}`,
         }}>
          <Icon name="arrow-right" size={11} color="currentColor"/>
          SAVE {discount}%
         </span>
        ) : premium ? (
         <span style={{
          display: "inline-flex", padding: "3px 9px", borderRadius: 999, fontSize: 11, fontWeight: 600, fontFamily: "var(--font-mono)",
          background: active ? "rgba(255,255,255,0.1)" : "var(--jv-ink-100)",
          color: active ? "rgba(255,255,255,0.7)" : "var(--color-fg-muted)",
         }}>
          +{premium}% small-lot
         </span>
        ) : (
         <span style={{
          display: "inline-flex", padding: "3px 9px", borderRadius: 999, fontSize: 11, fontWeight: 600, fontFamily: "var(--font-mono)",
          background: active ? "rgba(255,255,255,0.1)" : "var(--jv-ink-100)",
          color: active ? "rgba(255,255,255,0.7)" : "var(--color-fg-muted)",
         }}>
          Base rate
         </span>
        )}
       </div>
      </button>
     );
    })}
   </div>

   <div style={{ background: "var(--jv-ink-50)", borderTop: "1px solid var(--color-divider)", padding: "12px 24px", display: "flex", gap: vp.isMobile ? 12 : 24, fontSize: 12, color: "var(--color-fg-muted)", flexWrap: "wrap" }}>
    <span>Prices indicative · FOB {priceModel.currency === "USD" ? "Hai Phong" : "Yokohama"}</span>
    <span>Excludes freight, insurance, duties</span>
    {!vp.isMobile && <span>LC at sight / TT 30% advance accepted</span>}
    <span style={{ marginLeft: vp.isMobile ? 0 : "auto" }}>Quoted in <Mono style={{ color: "var(--color-fg)" }}>{priceModel.currency}</Mono></span>
   </div>
  </div>
 );
};

// =============================================================================
const LotCalculator = ({ tiers, priceModel, qty, setQty, activeTier, subtotal, savings, onRFQ, supplier, vp }) => {
 const max = priceModel.moqQty * 80;
 return (
  <div style={{ background: "#fff", border: "1px solid var(--color-border)", borderRadius: 10, padding: vp.isMobile ? "18px 18px 20px" : "22px 24px 24px", display: "flex", flexDirection: "column" }}>
   <div style={{ display: "flex", alignItems: "baseline", justifyContent: "space-between", flexWrap: "wrap", gap: 6 }}>
    <Eyebrow>Lot calculator · request a quote</Eyebrow>
    <span style={{ fontSize: 11, color: "var(--color-fg-muted)", fontFamily: "var(--font-mono)" }}>Indicative · pre-RFQ</span>
   </div>

   <div style={{ marginTop: 18, display: "flex", alignItems: "flex-end", justifyContent: "space-between", gap: 24, flexWrap: "wrap" }}>
    <div style={{ flex: vp.isMobile ? "1 1 100%" : 1, minWidth: 200 }}>
     <label style={{ fontSize: 12, color: "var(--color-fg-muted)", display: "block", marginBottom: 6 }}>Order quantity ({priceModel.unit})</label>
     <div style={{ display: "flex", alignItems: "stretch", gap: 0 }}>
      <button onClick={() => setQty(Math.max(priceModel.moqQty, Math.round(qty * 0.5)))}
       style={{ width: 36, height: 44, border: "1px solid var(--color-border)", borderRight: 0, background: "#fff", cursor: "pointer", borderRadius: "6px 0 0 6px", fontSize: 18, color: "var(--jv-navy-800)" }}>−</button>
      <input
       type="number"
       value={qty}
       onChange={e => setQty(Math.max(priceModel.moqQty, parseInt(e.target.value) || priceModel.moqQty))}
       style={{ flex: 1, minWidth: 0, padding: "0 14px", border: "1px solid var(--color-border)", fontFamily: "var(--font-mono)", fontSize: 18, fontWeight: 600, color: "var(--jv-navy-800)", textAlign: "center", outline: "none", borderRadius: 0 }}/>
      <button onClick={() => setQty(Math.round(qty * 1.5))}
       style={{ width: 36, height: 44, border: "1px solid var(--color-border)", borderLeft: 0, background: "#fff", cursor: "pointer", borderRadius: "0 6px 6px 0", fontSize: 18, color: "var(--jv-navy-800)" }}>+</button>
     </div>
    </div>

    <div style={{ textAlign: vp.isMobile ? "left" : "right" }}>
     <div style={{ fontSize: 11, color: "var(--color-fg-muted)", textTransform: "uppercase", letterSpacing: "0.07em", fontWeight: 600, marginBottom: 4 }}>Subtotal</div>
     <Mono style={{ fontSize: vp.isMobile ? 24 : 28, fontWeight: 600, color: "var(--jv-navy-800)", letterSpacing: "-0.01em" }}>{formatMoney(subtotal, priceModel.currency)}</Mono>
     <div style={{ fontSize: 12, color: "var(--color-fg-muted)", marginTop: 2, fontFamily: "var(--font-mono)" }}>
      @ {formatMoney(activeTier.unit, priceModel.currency)} / {priceModel.unit}
     </div>
    </div>
   </div>

   <div style={{ marginTop: 22, position: "relative", height: 56 }}>
    <div style={{ position: "absolute", left: 0, right: 0, top: 22, height: 6, background: "var(--jv-ink-100)", borderRadius: 999 }}/>
    <div style={{ position: "absolute", left: 0, top: 22, height: 6, background: "var(--jv-navy-800)", borderRadius: 999, width: `${Math.min(100, (Math.log(qty) - Math.log(priceModel.moqQty)) / (Math.log(max) - Math.log(priceModel.moqQty)) * 100)}%` }}/>
    {tiers.map((t, i) => {
     const left = i === 0 ? 0 : Math.min(100, (Math.log(t.lo) - Math.log(priceModel.moqQty)) / (Math.log(max) - Math.log(priceModel.moqQty)) * 100);
     if (i === 0) return null;
     return (
      <div key={t.id} style={{ position: "absolute", left: `${left}%`, top: 17, transform: "translateX(-50%)", display: "flex", flexDirection: "column", alignItems: "center" }}>
       <div style={{ width: 1, height: 16, background: "var(--color-border-strong)" }}/>
       <div style={{ marginTop: 4, fontSize: 10, color: "var(--color-fg-muted)", fontFamily: "var(--font-mono)", whiteSpace: "nowrap" }}>{formatQty(t.lo, priceModel.unit)}</div>
      </div>
     );
    })}
    <input
     type="range"
     min={Math.log(priceModel.moqQty)}
     max={Math.log(max)}
     step={0.01}
     value={Math.log(qty)}
     onChange={e => setQty(Math.round(Math.exp(parseFloat(e.target.value))))}
     style={{ position: "absolute", left: -2, right: -2, top: 16, width: "calc(100% + 4px)", height: 18, opacity: 0, cursor: "pointer", margin: 0 }}/>
    <div style={{ position: "absolute", top: 17, left: `${Math.min(100, (Math.log(qty) - Math.log(priceModel.moqQty)) / (Math.log(max) - Math.log(priceModel.moqQty)) * 100)}%`, transform: "translateX(-50%)", width: 16, height: 16, borderRadius: 999, background: "#fff", border: "2px solid var(--jv-navy-800)", boxShadow: "0 1px 2px rgba(11,42,74,0.2)", pointerEvents: "none" }}/>
   </div>

   <div style={{ marginTop: 6, display: "flex", alignItems: "center", justifyContent: "space-between", gap: 16, paddingTop: 16, borderTop: "1px solid var(--color-divider)", flexWrap: "wrap" }}>
    <div style={{ display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }}>
     <span style={{ fontSize: 12, color: "var(--color-fg-muted)" }}>Quick fill:</span>
     {[priceModel.moqQty, priceModel.moqQty * 5, priceModel.moqQty * 20, priceModel.moqQty * 50].map((q, i) => (
      <button key={i} onClick={() => setQty(q)}
       style={{ padding: "4px 10px", border: "1px solid var(--color-border)", borderRadius: 4, background: qty === q ? "var(--jv-navy-50)" : "#fff", fontFamily: "var(--font-mono)", fontSize: 12, color: "var(--jv-navy-800)", cursor: "pointer" }}>
       {formatQty(q, priceModel.unit)}
      </button>
     ))}
    </div>
    {savings > 0 && (
     <div style={{ display: "flex", alignItems: "center", gap: 6, fontSize: 12, color: "var(--jv-trust-700)" }}>
      <Icon name="check" size={12} color="var(--jv-trust-600)"/>
      <span>Saving <Mono style={{ fontWeight: 600 }}>{formatMoney(savings, priceModel.currency)}</Mono> vs Tier 1</span>
     </div>
    )}
   </div>

   <div style={{ marginTop: 18, paddingTop: 18, borderTop: "1px solid var(--color-border)" }}>
    <div style={{ display: "grid", gridTemplateColumns: vp.isMobile ? "1fr" : "1fr 1fr 1fr", gap: 12 }}>
     <Field label="Incoterm">
      <Select defaultValue="FOB"><option>FOB</option><option>CIF</option><option>DAP</option></Select>
     </Field>
     <Field label="Origin port">
      <Select defaultValue={priceModel.currency === "USD" ? "Hai Phong" : "Yokohama"}>
       <option>Hai Phong</option><option>Cat Lai</option><option>Da Nang</option><option>Yokohama</option>
      </Select>
     </Field>
     <Field label="Required by">
      <Input type="date" defaultValue="2026-07-15"/>
     </Field>
    </div>
   </div>

   <div style={{ marginTop: 18, padding: "14px 16px", background: "var(--jv-navy-50)", borderRadius: 6, display: "flex", alignItems: "center", justifyContent: "space-between", gap: 16, flexWrap: "wrap" }}>
    <div style={{ display: "flex", alignItems: "center", gap: 14, minWidth: 0 }}>
     <Icon name="shield-check" size={20} color="var(--jv-trust-600)"/>
     <div style={{ fontSize: 12, color: "var(--color-fg-body)", lineHeight: 1.5 }}>
      Sent to <Mono style={{ color: "var(--jv-navy-800)", fontWeight: 600 }}>{supplier ? supplier.name : "supplier"}</Mono><br/>
      <span style={{ color: "var(--color-fg-muted)" }}>Reply within 1 business day · No buyer fees</span>
     </div>
    </div>
    <div style={{ display: "flex", gap: 8, flexWrap: "wrap" }}>
     <Button variant="secondary">{vp.isMobile ? "Message" : "Message supplier"}</Button>
     <Button variant="primary" onClick={onRFQ} trailing="arrow-right">Send RFQ</Button>
    </div>
   </div>
  </div>
 );
};

// =============================================================================
const PaymentOptions = ({ priceModel, subtotal }) => {
 const rows = [
  { label: "FOB subtotal", v: subtotal, muted: false },
  { label: "Ocean freight (est.)", v: subtotal * 0.06, muted: true },
  { label: "Insurance (0.3%)", v: subtotal * 0.003, muted: true },
  { label: "Inspection (SGS)", v: priceModel.currency === "JPY" ? 80000 : 540, muted: true, flat: true },
 ];
 const cif = rows.reduce((s, r) => s + r.v, 0);
 return (
  <div style={{ background: "#fff", border: "1px solid var(--color-border)", borderRadius: 10, padding: "22px 24px 24px", display: "flex", flexDirection: "column" }}>
   <div style={{ display: "flex", alignItems: "baseline", justifyContent: "space-between", flexWrap: "wrap", gap: 6 }}>
    <Eyebrow>Landed estimate</Eyebrow>
    <span style={{ fontSize: 11, color: "var(--color-fg-muted)", fontFamily: "var(--font-mono)" }}>CIF Yokohama · indicative</span>
   </div>

   <div style={{ marginTop: 14, display: "flex", flexDirection: "column", gap: 0, flex: 1 }}>
    {rows.map((r, i) => (
     <div key={i} style={{ display: "flex", justifyContent: "space-between", alignItems: "center", padding: "10px 0", borderTop: i ? "1px solid var(--color-divider)" : 0, fontSize: 13 }}>
      <span style={{ color: r.muted ? "var(--color-fg-muted)" : "var(--color-fg-body)" }}>{r.label}</span>
      <Mono style={{ color: r.muted ? "var(--color-fg-muted)" : "var(--jv-navy-800)" }}>{formatMoney(r.v, priceModel.currency)}</Mono>
     </div>
    ))}
    <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", padding: "12px 0 0", borderTop: "1px solid var(--color-border)", marginTop: 4 }}>
     <span style={{ fontSize: 13, color: "var(--jv-navy-800)", fontWeight: 600 }}>CIF total (est.)</span>
     <Mono style={{ fontSize: 18, fontWeight: 600, color: "var(--jv-navy-800)" }}>{formatMoney(cif, priceModel.currency)}</Mono>
    </div>
   </div>

   <div style={{ marginTop: 14, padding: "10px 12px", background: "var(--jv-ink-50)", borderRadius: 4, fontSize: 11, color: "var(--color-fg-muted)", lineHeight: 1.6 }}>
    Freight uses the 12-week average for VN → JP refrigerated TEU. JVFood verifies and replaces with live carrier quotes on RFQ.
   </div>
  </div>
 );
};

// =============================================================================
// GALLERY
// =============================================================================
const Gallery = ({ product }) => {
 const [idx, setIdx] = useState(0);
 const altImgs = [
  product.img,
  "https://images.unsplash.com/photo-1565680018434-b513d5e5fd47?auto=format&fit=crop&w=600&q=70",
  "https://images.unsplash.com/photo-1535990379313-5764f6e0a506?auto=format&fit=crop&w=600&q=70",
  "https://images.unsplash.com/photo-1606851094291-6efae152bb87?auto=format&fit=crop&w=600&q=70",
  "https://images.unsplash.com/photo-1599458252573-56ae36120de1?auto=format&fit=crop&w=600&q=70",
 ];
 return (
  <div>
   <div style={{ position: "relative", width: "100%", aspectRatio: "1 / 1", borderRadius: 10, overflow: "hidden", background: "var(--jv-ink-100)", border: "1px solid var(--color-border)" }}>
    <img src={altImgs[idx]} alt={product.name}
     style={{ position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" }}
     onError={e => { e.currentTarget.style.opacity = 0; }}/>
    <div style={{ position: "absolute", top: 14, left: 14, display: "flex", gap: 6 }}>
     <span style={{ display: "inline-flex", alignItems: "center", gap: 6, padding: "5px 10px", background: "rgba(255,255,255,0.92)", borderRadius: 4, fontSize: 12, fontWeight: 500, color: "var(--jv-navy-800)", backdropFilter: "blur(6px)" }}>
      <img src={`assets/flag-${product.origin}.svg`} width="14" height="10"/>
      Origin {product.origin.toUpperCase()}
     </span>
    </div>
    <div style={{ position: "absolute", bottom: 14, right: 14, padding: "5px 10px", background: "rgba(11,42,74,0.85)", color: "#fff", borderRadius: 4, fontSize: 11, fontFamily: "var(--font-mono)", letterSpacing: "0.04em" }}>
     {idx + 1} / {altImgs.length}
    </div>
   </div>
   <div style={{ marginTop: 12, display: "grid", gridTemplateColumns: "repeat(5, minmax(0, 1fr))", gap: 8 }}>
    {altImgs.map((src, i) => (
     <button key={i} onClick={() => setIdx(i)}
      style={{ aspectRatio: "1 / 1", border: `1px solid ${idx === i ? "var(--jv-navy-800)" : "var(--color-border)"}`, borderRadius: 6, padding: 0, overflow: "hidden", cursor: "pointer", background: "var(--jv-ink-100)" }}>
      <img src={src} alt="" style={{ width: "100%", height: "100%", objectFit: "cover", opacity: idx === i ? 1 : 0.85 }} onError={e => { e.currentTarget.style.opacity = 0; }}/>
     </button>
    ))}
   </div>
  </div>
 );
};

// =============================================================================
// TAB CONTENT
// =============================================================================
const SpecsTab = ({ priceModel, vp }) => (
 <div>
  <Eyebrow>Product specifications</Eyebrow>
  <h2 style={{ fontSize: vp.isMobile ? 20 : 22, color: "var(--jv-navy-800)", marginTop: 8, marginBottom: 20 }}>Datasheet</h2>
  <SpecGrid rows={[
   { label: "HS Code", value: priceModel.hs },
   { label: "Latin / scientific", value: "Penaeus monodon" },
   { label: "Cut / form", value: "Headless, shell-on (HLSO)" },
   { label: "Grade", value: "16 / 20 count per lb" },
   { label: "Glaze", value: "≤ 8%" },
   { label: "Moisture", value: "78 ± 2%" },
   { label: "Shelf life", value: "24 months @ −18 °C" },
   { label: "Allergens", value: "Crustacean (shrimp)" },
   { label: "Country of origin", value: "Vietnam (VN-CT-098)" },
   { label: "Production method", value: "Pond-farmed, ASC chain-of-custody" },
   { label: "Treatment", value: "No SO₂ · no phosphates" },
   { label: "Microbiological", value: "TPC ≤ 5×10⁵ / g · Salmonella absent" },
  ]} vp={vp}/>
 </div>
);

const PackingTab = ({ priceModel, tiers, vp }) => (
 <div>
  <Eyebrow>Packing & lot composition</Eyebrow>
  <h2 style={{ fontSize: vp.isMobile ? 20 : 22, color: "var(--jv-navy-800)", marginTop: 8, marginBottom: 20 }}>How it ships</h2>
  <div style={{ display: "grid", gridTemplateColumns: vp.isMobile ? "1fr" : "1fr 1fr 1fr", gap: 16, marginBottom: 24 }}>
   {[
    { eyebrow: "Inner", v: "1.0 kg", cap: "Vacuum-sealed retail block", icon: "package" },
    { eyebrow: "Carton", v: "10 kg", cap: "Wax-coated master carton × 10", icon: "package" },
    { eyebrow: "Pallet", v: "1 000 kg", cap: "100 cartons · EUR1 pallet", icon: "package" },
   ].map(c => (
    <div key={c.eyebrow} style={{ border: "1px solid var(--color-border)", borderRadius: 6, padding: 18 }}>
     <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 14 }}>
      <Eyebrow>{c.eyebrow}</Eyebrow>
      <Icon name={c.icon} size={20} color="var(--color-fg-muted)"/>
     </div>
     <Mono style={{ fontSize: 22, fontWeight: 600, color: "var(--jv-navy-800)" }}>{c.v}</Mono>
     <div style={{ fontSize: 13, color: "var(--color-fg-muted)", marginTop: 6 }}>{c.cap}</div>
    </div>
   ))}
  </div>

  <h3 style={{ fontSize: 16, color: "var(--jv-navy-800)", marginBottom: 12 }}>Container loading at each tier</h3>
  <div style={{ border: "1px solid var(--color-border)", borderRadius: 6, overflow: "hidden" }}>
   <div className="jv-x-scroll">
    <table style={{ width: "100%", borderCollapse: "collapse", fontSize: 13, minWidth: 640 }}>
     <thead style={{ background: "var(--jv-ink-50)" }}>
      <tr style={{ textAlign: "left", color: "var(--color-fg-muted)", fontSize: 11, letterSpacing: "0.06em", textTransform: "uppercase", fontWeight: 500 }}>
       <th style={{ padding: "10px 14px" }}>Tier</th>
       <th style={{ padding: "10px 14px" }}>Quantity</th>
       <th style={{ padding: "10px 14px" }}>Cartons</th>
       <th style={{ padding: "10px 14px" }}>Pallets</th>
       <th style={{ padding: "10px 14px" }}>Container</th>
       <th style={{ padding: "10px 14px" }}>Fill</th>
      </tr>
     </thead>
     <tbody>
      {[
       { tier: "Tier 1 · Starter", q: "500 kg", c: "50", p: "0.5", ct: "LCL groupage", fill: "5%" },
       { tier: "Tier 2 · Standard", q: "2 t", c: "200", p: "2", ct: "LCL groupage", fill: "20%" },
       { tier: "Tier 3 · Volume", q: "10 t", c: "1 000", p: "10", ct: "20' RF", fill: "100%" },
       { tier: "Tier 4 · Container", q: "20 t", c: "2 000", p: "20", ct: "40' RF HC", fill: "100%" },
      ].map((r, i) => (
       <tr key={i} style={{ borderTop: "1px solid var(--color-divider)" }}>
        <td style={{ padding: "12px 14px", color: "var(--jv-navy-800)", fontWeight: 500 }}>{r.tier}</td>
        <td style={{ padding: "12px 14px" }}><Mono>{r.q}</Mono></td>
        <td style={{ padding: "12px 14px" }}><Mono>{r.c}</Mono></td>
        <td style={{ padding: "12px 14px" }}><Mono>{r.p}</Mono></td>
        <td style={{ padding: "12px 14px", color: "var(--color-fg-body)" }}>{r.ct}</td>
        <td style={{ padding: "12px 14px" }}><Mono style={{ color: "var(--color-fg-body)" }}>{r.fill}</Mono></td>
       </tr>
      ))}
     </tbody>
    </table>
   </div>
  </div>
 </div>
);

const LogisticsTab = ({ supplier, priceModel, vp }) => (
 <div>
  <Eyebrow>Logistics</Eyebrow>
  <h2 style={{ fontSize: vp.isMobile ? 20 : 22, color: "var(--jv-navy-800)", marginTop: 8, marginBottom: 20 }}>Shipping & terms</h2>
  <SpecGrid rows={[
   { label: "Incoterm", value: "FOB, CIF, DAP available" },
   { label: "Origin port", value: `${supplier.city}, ${supplier.country.toUpperCase()}` },
   { label: "Typical transit", value: "10 – 12 days to Yokohama" },
   { label: "Cold chain", value: "−18 °C reefer, continuous temperature log" },
   { label: "Documentation", value: "Commercial invoice, packing list, B/L, phyto-sanitary, H&C, COO" },
   { label: "Payment terms", value: "LC at sight · TT 30% / 70% · OA up to 60 d for verified buyers" },
   { label: "Sample policy", value: "5 kg sample lot free; freight on buyer; 7-day production" },
   { label: "Carbon", value: "≈ 0.42 kg CO₂e / kg product, reefer-ocean basis" },
  ]} vp={vp}/>
 </div>
);

const ComplianceTab = ({ certs, vp }) => (
 <div>
  <Eyebrow>Compliance & documents</Eyebrow>
  <h2 style={{ fontSize: vp.isMobile ? 20 : 22, color: "var(--jv-navy-800)", marginTop: 8, marginBottom: 20 }}>Audit-ready paperwork</h2>
  <div style={{ border: "1px solid var(--color-border)", borderRadius: 6, overflow: "hidden" }}>
   {certs.map((c, i) => (
    <div key={c} style={{ padding: vp.isMobile ? "14px 16px" : "16px 20px", display: "flex", alignItems: "center", justifyContent: "space-between", borderTop: i ? "1px solid var(--color-divider)" : 0, gap: 12 }}>
     <div style={{ display: "flex", alignItems: "center", gap: 14, minWidth: 0 }}>
      <Icon name="shield-check" size={20} color="var(--jv-trust-600)"/>
      <div style={{ minWidth: 0 }}>
       <div style={{ fontSize: 14, fontWeight: 500, color: "var(--jv-navy-800)" }}>{c}</div>
       <div style={{ fontSize: 12, color: "var(--color-fg-muted)" }}>Issued 2024-08 · Valid through 2027-08 · Auditor: SGS Vietnam</div>
      </div>
     </div>
     <Button variant="ghost" size="sm" trailing="external">PDF</Button>
    </div>
   ))}
   {["Lab test report, heavy metals & antibiotics (2026-03)", "Phytosanitary template (JP-MAFF compliant)", "Allergen statement"].map((d, i) => (
    <div key={d} style={{ padding: vp.isMobile ? "14px 16px" : "16px 20px", display: "flex", alignItems: "center", justifyContent: "space-between", borderTop: "1px solid var(--color-divider)", gap: 12 }}>
     <div style={{ display: "flex", alignItems: "center", gap: 14, minWidth: 0 }}>
      <Icon name="file-check" size={20} color="var(--color-fg-muted)"/>
      <div style={{ fontSize: 14, color: "var(--jv-navy-800)" }}>{d}</div>
     </div>
     <Button variant="ghost" size="sm" trailing="external">PDF</Button>
    </div>
   ))}
  </div>
 </div>
);

const SupplierMini = ({ supplier, onNavigate, vp }) => (
 <div>
  <Eyebrow>Supplier</Eyebrow>
  <h2 style={{ fontSize: vp.isMobile ? 20 : 22, color: "var(--jv-navy-800)", marginTop: 8, marginBottom: 20 }}>About {supplier.name}</h2>
  <p style={{ fontSize: 14, lineHeight: 1.6, color: "var(--color-fg-body)", maxWidth: 640, marginBottom: 24 }}>{supplier.blurb}</p>
  <div style={{ display: "grid", gridTemplateColumns: vp.isMobile ? "1fr" : "repeat(3, 1fr)", gap: 16, marginBottom: 24 }}>
   {[
    { l: "Established", v: supplier.established },
    { l: "Employees", v: supplier.employees },
    { l: "Revenue", v: supplier.revenueBand },
   ].map(c => (
    <div key={c.l} style={{ border: "1px solid var(--color-border)", borderRadius: 6, padding: 16 }}>
     <Eyebrow>{c.l}</Eyebrow>
     <Mono style={{ fontSize: 18, color: "var(--jv-navy-800)", marginTop: 6, display: "block" }}>{c.v}</Mono>
    </div>
   ))}
  </div>
  <Button variant="secondary" onClick={() => onNavigate("profile", supplier.id)} trailing="arrow-right">View full supplier profile</Button>
 </div>
);

// =============================================================================
const SpecGrid = ({ rows, vp }) => (
 <div style={{ border: "1px solid var(--color-border)", borderRadius: 6, overflow: "hidden" }}>
  {rows.map((r, i) => (
   <div key={r.label} style={{ display: "grid", gridTemplateColumns: vp && vp.isMobile ? "1fr" : "240px 1fr", padding: vp && vp.isMobile ? "10px 14px" : "12px 16px", borderTop: i ? "1px solid var(--color-divider)" : 0, fontSize: 13, gap: vp && vp.isMobile ? 4 : 0 }}>
    <div style={{ color: "var(--color-fg-muted)" }}>{r.label}</div>
    <div style={{ color: "var(--jv-navy-800)" }}>{r.value}</div>
   </div>
  ))}
 </div>
);

const FactCardP = ({ label, children }) => (
 <div style={{ border: "1px solid var(--color-border)", borderRadius: 6, padding: 16 }}>
  <Eyebrow style={{ marginBottom: 12 }}>{label}</Eyebrow>
  {children}
 </div>
);

const MiniProductCard = ({ product: p, onNavigate }) => {
 const [hover, setHover] = useState(false);
 return (
  <div
   onMouseEnter={() => setHover(true)}
   onMouseLeave={() => setHover(false)}
   onClick={() => onNavigate && onNavigate("product-detail", p.id)}
   style={{
    background: "#fff",
    border: `1px solid ${hover ? "var(--color-border-strong)" : "var(--color-border)"}`,
    borderRadius: 6, overflow: "hidden", cursor: "pointer",
    boxShadow: hover ? "var(--shadow-1)" : "none",
    transition: "border-color 120ms var(--ease-standard), box-shadow 120ms var(--ease-standard)",
   }}>
   <div style={{ aspectRatio: "4 / 3", background: "var(--jv-ink-100)", position: "relative" }}>
    <img src={p.img} alt="" style={{ position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" }} onError={e => { e.currentTarget.style.opacity = 0; }}/>
   </div>
   <div style={{ padding: 12 }}>
    <div style={{ fontSize: 13, fontWeight: 600, color: "var(--jv-navy-800)", lineHeight: 1.35, height: 36, overflow: "hidden" }}>{p.name}</div>
    <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", marginTop: 8, paddingTop: 8, borderTop: "1px solid var(--color-divider)" }}>
     <Mono style={{ fontSize: 11, color: "var(--color-fg-muted)" }}>MOQ {p.moq}</Mono>
     <Mono style={{ fontSize: 13, fontWeight: 600, color: "var(--jv-navy-800)" }}>{p.price}</Mono>
    </div>
   </div>
  </div>
 );
};

function categoryLabel(id) {
 const c = PRODUCT_CATEGORIES.find(x => x.id === id);
 return c ? c.label : "Products";
}
function hsForCategory(c) {
 return ({
  seafood: "0306.17.10",
  frozen: "1605.21.00",
  ingredients: "2103.90.40",
  processed: "1902.20.00",
  dried: "0813.40.00",
  fruits: "0810.90.00",
  beverages: "2009.89.00",
  "tea-coffee": "0902.30.00",
  petfood: "2309.10.00",
  snacks: "1905.31.00",
 })[c] || "0000.00.00";
}
function packForProduct(p) {
 if (p.category === "seafood") return "10 kg carton";
 if (p.category === "frozen") return "10 kg carton";
 if (p.category === "dried") return "10 kg sack";
 if (p.category === "ingredients") return "Carton × 12";
 return "Master carton";
}
function jaName(p) {
 return ({
  p01: "ブラックタイガーエビ HLSO 16/20",
  p02: "パンガシウス フィレ IQF",
  p03: "北海道産帆立 刺身グレード",
  p04: "冷凍さば ラウンド",
  p05: "鮪ロイン サク",
 })[p.id] || p.name;
}
function descFor(p) {
 return p.category === "seafood"
  ? "Pond-farmed Penaeus monodon, headless and shell-on, individually quick-frozen on a tunnel freezer within 4 hours of harvest. Sized 16–20 count per lb for retail tempura and gyoza filling applications. ASC chain-of-custody from farm to processor; no SO₂ or phosphate treatment."
  : "Manufactured at a BRCGS-audited facility under HACCP. Specification sheet, allergen statement, and recent third-party lab report available on request, JVFood pre-screens each document for buyers.";
}
function harvestFor(p) {
 if (p.origin === "vn") return "FAO 71 (Western Central Pacific)";
 return "Hokkaido / Sea of Okhotsk";
}

Object.assign(window, { ProductDetailPage });
