/* GECKO — Sitio web (React) */
const { useState, useMemo, useEffect, useRef } = React;

const WA_NUMBER = "507XXXXXXXX"; // ← reemplazar por el WhatsApp real

/* ---------------- image store (localStorage) ---------------- */
const IMG_KEY = "gecko_prod_imgs_v1";
const loadImgs = () => { try { return JSON.parse(localStorage.getItem(IMG_KEY) || "{}"); } catch (e) { return {}; } };
const saveImgs = (m) => { try { localStorage.setItem(IMG_KEY, JSON.stringify(m)); } catch (e) { alert("No se pudo guardar la imagen: almacenamiento lleno. Usa una foto más liviana."); } };

/* resize any dropped image down to a web-friendly JPEG so localStorage no se llena */
function resizeImage(file, max = 760) {
  return new Promise((res, rej) => {
    if (!file || !file.type || !file.type.startsWith("image/")) return rej();
    const r = new FileReader();
    r.onload = () => {
      const img = new Image();
      img.onload = () => {
        let w = img.width, h = img.height;
        const s = Math.min(1, max / Math.max(w, h));
        w = Math.round(w * s); h = Math.round(h * s);
        const c = document.createElement("canvas");
        c.width = w; c.height = h;
        const ctx = c.getContext("2d");
        ctx.fillStyle = "#fff"; ctx.fillRect(0, 0, w, h);
        ctx.drawImage(img, 0, 0, w, h);
        res(c.toDataURL("image/jpeg", 0.82));
      };
      img.onerror = rej;
      img.src = r.result;
    };
    r.onerror = rej;
    r.readAsDataURL(file);
  });
}

/* ---------------- data ---------------- */
const CATS = [
  { key: "motor",      name: "Motor & Mecánica",     count: "1.240 SKU", icon: "gear" },
  { key: "frenos",     name: "Frenos & Suspensión",  count: "880 SKU",   icon: "disc" },
  { key: "electricos", name: "Eléctricos & Baterías",count: "960 SKU",   icon: "bolt" },
  { key: "accesorios", name: "Accesorios & Estética",count: "1.510 SKU", icon: "star" },
  { key: "aceites",    name: "Aceites & Lubricantes",count: "320 SKU",   icon: "drop" },
  { key: "genericos",  name: "Genéricos & Alternos", count: "2.100 SKU", icon: "box"  },
];

const REGIONS = ["Europeas", "Chinas", "Americanas", "Coreanas"];

const MARCAS = ["Toyota","Hyundai","Kia","Nissan","Volkswagen","BMW","Chevrolet","Ford","Honda","Mazda","Geely","Chery","BYD","Mercedes-Benz"];
const MODELOS = ["Sedán","SUV / Crossover","Pick-up","Hatchback","Van / Carga"];
const ANIOS = ["2024+","2018 – 2023","2012 – 2017","2006 – 2011","2000 – 2005"];

const P = [
  { id:1,  name:"Pastillas de freno cerámicas", cat:"frenos",     region:"Coreanas",   sku:"GK-FR-4820", price:38.90, was:54.90, off:29 },
  { id:2,  name:"Batería 12V 75Ah libre mant.", cat:"electricos", region:"Americanas", sku:"GK-EL-7501", price:119.00, was:149.00, off:20 },
  { id:3,  name:"Filtro de aceite premium",      cat:"motor",      region:"Europeas",   sku:"GK-MT-0091", price:8.50 },
  { id:4,  name:"Amortiguador delantero gas",    cat:"frenos",     region:"Coreanas",   sku:"GK-SU-3340", price:64.00, was:89.00, off:28 },
  { id:5,  name:"Kit de embrague completo",      cat:"motor",      region:"Europeas",   sku:"GK-MT-2210", price:210.00 },
  { id:6,  name:"Alternador remanufacturado",    cat:"electricos", region:"Americanas", sku:"GK-EL-1180", price:175.00, was:240.00, off:27 },
  { id:7,  name:"Bujías de iridio (juego x4)",   cat:"motor",      region:"Europeas",   sku:"GK-MT-0444", price:32.00 },
  { id:8,  name:"Disco de freno ventilado",      cat:"frenos",     region:"Chinas",     sku:"GK-FR-5102", price:44.00 },
  { id:9,  name:"Aceite sintético 5W-30 · 4L",   cat:"aceites",    region:"Europeas",   sku:"GK-AC-5304", price:39.90, was:49.90, off:20 },
  { id:10, name:"Faro LED delantero",            cat:"accesorios", region:"Chinas",     sku:"GK-AX-8890", price:89.00 },
  { id:11, name:"Bomba de agua + empaque",       cat:"motor",      region:"Coreanas",   sku:"GK-MT-6620", price:52.00, was:72.00, off:28 },
  { id:12, name:"Sensor de oxígeno (lambda)",    cat:"electricos", region:"Americanas", sku:"GK-EL-9031", price:48.00 },
  { id:13, name:"Brazo de control inferior",     cat:"frenos",     region:"Chinas",     sku:"GK-SU-5810", price:58.00 },
  { id:14, name:"Plumillas limpiaparabrisas",    cat:"accesorios", region:"Genéricos",  sku:"GK-AX-1490", price:14.90 },
  { id:15, name:"Kit correa de distribución",    cat:"motor",      region:"Coreanas",   sku:"GK-MT-7698", price:76.00, was:98.00, off:22 },
  { id:16, name:"Cubierta de motor universal",   cat:"accesorios", region:"Genéricos",  sku:"GK-AX-2200", price:22.00 },
];

const catName = (k) => (CATS.find(c => c.key === k) || {}).name || k;
const money = (n) => "B/. " + n.toFixed(2);

/* fotos reales por defecto (relativas a web/Sitio GECKO.html) */
const DEFAULT_IMG = {
  "GK-FR-4820": "products/pastillas-freno.png", // pastillas de freno cerámicas
  "GK-EL-7501": "products/bateria.png",          // batería 12V 75Ah
  "GK-MT-0091": "products/filtro-aceite.png",    // filtro de aceite premium
  "GK-SU-3340": "products/amortiguador.png",     // amortiguador delantero gas
  "GK-MT-2210": "products/kit-embrague.png",     // kit de embrague
  "GK-EL-1180": "products/alternador.png",       // alternador remanufacturado
  "GK-MT-0444": "products/bujias.png",            // bujías de iridio
  "GK-FR-5102": "products/disco-freno.png",       // disco de freno ventilado
  "GK-AC-5304": "products/aceite-sintetico.png",  // aceite sintético
  "GK-AX-8890": "products/faro-led.png",          // faro LED delantero
  "GK-MT-6620": "products/bomba-agua.png",        // bomba de agua + empaque
  "GK-EL-9031": "products/sensor-oxigeno.png",    // sensor de oxígeno (lambda)
  "GK-SU-5810": "products/brazo-control.png",     // brazo de control inferior
  "GK-AX-1490": "products/plumillas.png",         // plumillas limpiaparabrisas
  "GK-AX-2200": "products/cubierta-motor.png",    // cubierta de motor
  // "GK-MT-7698": kit correa de distribución — pendiente (foto duplicada)
};

/* ---------------- icons ---------------- */
function Ico({ n, s = 22 }) {
  const p = { width:s, height:s, viewBox:"0 0 24 24", fill:"none", stroke:"currentColor", strokeWidth:1.7, strokeLinecap:"round", strokeLinejoin:"round" };
  switch (n) {
    case "gear":  return <svg {...p}><circle cx="12" cy="12" r="3.2"/><path d="M12 2.5v3M12 18.5v3M21.5 12h-3M5.5 12h-3M18.7 5.3l-2.1 2.1M7.4 16.6l-2.1 2.1M18.7 18.7l-2.1-2.1M7.4 7.4 5.3 5.3"/></svg>;
    case "disc":  return <svg {...p}><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="2.4"/><path d="M12 3.5v3M12 17.5v3M3.5 12h3M17.5 12h3"/></svg>;
    case "bolt":  return <svg {...p}><path d="M13 2 4.5 13.5H11l-1 8.5L19 10h-6.5z"/></svg>;
    case "star":  return <svg {...p}><path d="M12 3l2 5.2 5.5.4-4.2 3.6 1.4 5.3L12 16.8 7.3 17.5l1.4-5.3L4.5 8.6 10 8.2z"/></svg>;
    case "drop":  return <svg {...p}><path d="M12 3s6 6.4 6 10.5A6 6 0 0 1 6 13.5C6 9.4 12 3 12 3z"/></svg>;
    case "box":   return <svg {...p}><path d="M3.5 7.5 12 3l8.5 4.5v9L12 21l-8.5-4.5z"/><path d="M3.5 7.5 12 12l8.5-4.5M12 12v9"/></svg>;
    case "search":return <svg {...p}><circle cx="11" cy="11" r="7"/><path d="m20 20-3.2-3.2"/></svg>;
    case "wa":    return <svg width={s} height={s} viewBox="0 0 24 24" fill="currentColor"><path d="M12 2a10 10 0 0 0-8.7 14.9L2 22l5.3-1.4A10 10 0 1 0 12 2zm0 18a8 8 0 0 1-4.1-1.1l-.3-.2-3 .8.8-2.9-.2-.3A8 8 0 1 1 12 20zm4.4-6c-.2-.1-1.4-.7-1.6-.8s-.4-.1-.5.1l-.7.9c-.1.2-.3.2-.5.1a6.5 6.5 0 0 1-3.2-2.8c-.2-.4.2-.4.6-1.2.1-.2 0-.3 0-.5l-.7-1.7c-.2-.5-.4-.4-.5-.4h-.5a1 1 0 0 0-.7.3A2.8 2.8 0 0 0 7 9.3a4.9 4.9 0 0 0 1 2.6 11.2 11.2 0 0 0 4.3 3.8c1.6.6 1.9.5 2.3.5a2.4 2.4 0 0 0 1.6-1.1 2 2 0 0 0 .1-1.1c0-.1-.2-.2-.5-.3z"/></svg>;
    case "check": return <svg {...p}><path d="m4.5 12.5 4.5 4.5 10.5-11"/></svg>;
    case "arrow": return <svg {...p}><path d="M6 18 18 6M9 6h9v9"/></svg>;
    case "truck": return <svg {...p}><path d="M2.5 6.5h11v9h-11zM13.5 9.5H18l3 3v3h-7.5"/><circle cx="6.5" cy="18" r="1.8"/><circle cx="17" cy="18" r="1.8"/></svg>;
    case "chat":  return <svg {...p}><path d="M4 5h16v11H8l-4 3.5z"/></svg>;
    case "x":     return <svg {...p}><path d="M6 6l12 12M18 6 6 18"/></svg>;
    case "cart":  return <svg {...p}><path d="M3 4h2l2 12h11l2-8H6.5"/><circle cx="9" cy="20" r="1.4"/><circle cx="17" cy="20" r="1.4"/></svg>;
    case "img":   return <svg {...p}><rect x="3" y="4.5" width="18" height="15" rx="2"/><circle cx="8.5" cy="10" r="1.6"/><path d="M21 16l-5-4.5L7 19.5"/></svg>;
    case "swap":  return <svg {...p}><path d="M4 8h12l-3-3M20 16H8l3 3"/></svg>;
    default: return null;
  }
}

function Logo({ cls = "wm lg" }) {
  return <span className={cls}>GECKO<i className="wm-mark"></i></span>;
}

/* ---------------- header ---------------- */
function Header({ search, setSearch, quoteCount, openQuote }) {
  return (
    <header className="site">
      <div className="wrap">
        <a href="#top"><Logo /></a>
        <nav className="main">
          <a href="#catalogo">Catálogo</a>
          <a href="#marcas">Marcas</a>
          <a href="#como">Cómo funciona</a>
          <a href="#contacto">Contacto</a>
        </nav>
        <div className="header-search">
          <Ico n="search" s={17} />
          <input value={search} onChange={e=>setSearch(e.target.value)} placeholder="Buscar repuesto o SKU…" />
        </div>
        <button className="btn btn-ink btn-sm quote-btn" onClick={openQuote}>
          <Ico n="cart" s={16} /> Cotización
          {quoteCount > 0 && <span className="quote-badge">{quoteCount}</span>}
        </button>
      </div>
    </header>
  );
}

/* ---------------- hero + finder ---------------- */
function Finder({ onSearch }) {
  const [m, setM] = useState(""); const [mo, setMo] = useState(""); const [a, setA] = useState(""); const [c, setC] = useState("");
  return (
    <div className="finder">
      <h3>Encuentra tu repuesto</h3>
      <p className="sub">Busca por marca y modelo — cotizamos al instante.</p>
      <div className="fields">
        <div className="field"><label>Marca</label>
          <select value={m} onChange={e=>setM(e.target.value)}><option value="">Todas las marcas</option>{MARCAS.map(x=><option key={x}>{x}</option>)}</select></div>
        <div className="field"><label>Modelo / tipo</label>
          <select value={mo} onChange={e=>setMo(e.target.value)}><option value="">Cualquiera</option>{MODELOS.map(x=><option key={x}>{x}</option>)}</select></div>
        <div className="field"><label>Año</label>
          <select value={a} onChange={e=>setA(e.target.value)}><option value="">Cualquiera</option>{ANIOS.map(x=><option key={x}>{x}</option>)}</select></div>
        <div className="field"><label>Categoría</label>
          <select value={c} onChange={e=>setC(e.target.value)}><option value="">Todas</option>{CATS.map(x=><option key={x.key} value={x.key}>{x.name}</option>)}</select></div>
      </div>
      <button className="btn btn-red" onClick={()=>onSearch(c)}><Ico n="search" s={17}/> Buscar repuesto</button>
    </div>
  );
}

function Hero({ onSearch }) {
  return (
    <section className="hero" id="top">
      <div className="wrap">
        <div>
          <p className="hero-eyebrow">Primera e-commerce de repuestos en Panamá</p>
          <h1>Repuestos para<br/><em>toda marca.</em><br/>En 24 horas.</h1>
          <p className="lead">Europeas, chinas, americanas y coreanas. Buscas la pieza, cotizas por WhatsApp y te la despachamos a todo Panamá en menos de un día.</p>
          <div className="hero-stats">
            <div className="st"><div className="n"><em>&lt;24</em>h</div><div className="l">Despacho</div></div>
            <div className="st"><div className="n">9.000+</div><div className="l">SKU en stock</div></div>
            <div className="st"><div className="n"><em>-30%</em></div><div className="l">En ofertas</div></div>
          </div>
        </div>
        <Finder onSearch={onSearch} />
      </div>
    </section>
  );
}

/* ---------------- regions ---------------- */
function Regions({ region, setRegion }) {
  return (
    <div className="regions" id="marcas">
      <div className="wrap">
        <span className="rl">Trabajamos:</span>
        <div className="region-chips">
          <button className={"chip"+(region===""?" on":"")} onClick={()=>setRegion("")}>Todas</button>
          {REGIONS.map(r => <button key={r} className={"chip"+(region===r?" on":"")} onClick={()=>setRegion(region===r?"":r)}>{r}</button>)}
        </div>
        <span className="rl" style={{marginLeft:"auto"}}>+14 marcas — Toyota, Hyundai, Kia, VW, BMW, Chery, BYD…</span>
      </div>
    </div>
  );
}

/* ---------------- categories ---------------- */
function Categories({ setCat }) {
  return (
    <section className="block" id="categorias">
      <div className="wrap">
        <div className="sec-head">
          <div>
            <p className="sec-eyebrow">Categorías</p>
            <h2 className="sec-title">Todo para tu vehículo</h2>
          </div>
        </div>
        <div className="cat-grid">
          {CATS.map(c => (
            <div key={c.key} className="cat" onClick={()=>setCat(c.key)}>
              <div className="arrow"><Ico n="arrow" s={18}/></div>
              <div className="ic"><Ico n={c.icon} s={24}/></div>
              <h4>{c.name}</h4>
              <div className="meta">{c.count}</div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ---------------- catalog ---------------- */
function PhotoSlot({ src, onSet, badge, label = "Agregar foto" }) {
  const inputRef = useRef();
  const [drag, setDrag] = useState(false);
  const handle = (file) => { resizeImage(file).then(onSet).catch(()=>{}); };
  return (
    <div className={"slot"+(drag?" drag":"")+(src?" filled":"")}
      onClick={()=>{ if(!src) inputRef.current.click(); }}
      onDragOver={e=>{ e.preventDefault(); setDrag(true); }}
      onDragLeave={()=>setDrag(false)}
      onDrop={e=>{ e.preventDefault(); setDrag(false); handle(e.dataTransfer.files[0]); }}>
      {badge}
      {src ? (
        <>
          <img src={src} alt="" />
          <div className="slot-tools">
            <button title="Cambiar foto" onClick={e=>{ e.stopPropagation(); inputRef.current.click(); }}><Ico n="swap" s={15}/></button>
            <button title="Quitar foto" onClick={e=>{ e.stopPropagation(); onSet(""); }}><Ico n="x" s={15}/></button>
          </div>
        </>
      ) : (
        <div className="slot-empty">
          <Ico n="img" s={26}/>
          <span>{label}</span>
          <small>Clic o arrastra</small>
        </div>
      )}
      <input ref={inputRef} type="file" accept="image/*" hidden onChange={e=>{ handle(e.target.files[0]); e.target.value=""; }} />
    </div>
  );
}

function ProductCard({ p, inQuote, add, img, setImage }) {
  return (
    <div className="prod">
      <div className="imgwrap">
        <PhotoSlot src={img} onSet={url=>setImage(p.sku, url)} badge={p.off ? <div className="badge">-{p.off}%</div> : null} />
      </div>
      <div className="body">
        <div className="ptag">{catName(p.cat)} · {p.region}</div>
        <h4>{p.name}</h4>
        <div className="sku">{p.sku}</div>
        <div className="price-row">
          <span className="price">{money(p.price)}</span>
          {p.was && <span className="was">{money(p.was)}</span>}
        </div>
        <button className={"btn btn-sm add "+(inQuote?"btn-ink added":"btn-red")} onClick={()=>add(p)}>
          {inQuote ? <><Ico n="check" s={15}/> Agregado</> : <><Ico n="cart" s={15}/> Cotizar</>}
        </button>
      </div>
    </div>
  );
}

function Catalog({ search, setSearch, cat, setCat, region, setRegion, quote, add, images, setImage }) {
  const list = useMemo(() => P.filter(p => {
    if (cat && p.cat !== cat) return false;
    if (region && p.region !== region) return false;
    if (search.trim()) {
      const q = search.toLowerCase();
      if (!(p.name.toLowerCase().includes(q) || p.sku.toLowerCase().includes(q) || catName(p.cat).toLowerCase().includes(q))) return false;
    }
    return true;
  }), [search, cat, region]);

  return (
    <section className="catalog block" id="catalogo">
      <div className="wrap">
        <div className="sec-head">
          <div>
            <p className="sec-eyebrow">Catálogo</p>
            <h2 className="sec-title">Repuestos en stock</h2>
            <p className="sec-desc">Precios de referencia. Cotiza por WhatsApp y confirmamos disponibilidad y despacho en menos de 24 horas.</p>
          </div>
        </div>
        <div className="filters">
          <button className={"chip"+(cat===""?" on":"")} onClick={()=>setCat("")}>Todo</button>
          {CATS.map(c => <button key={c.key} className={"chip"+(cat===c.key?" on":"")} onClick={()=>setCat(cat===c.key?"":c.key)}>{c.name}</button>)}
          <span className="count">{list.length} resultado{list.length!==1?"s":""}</span>
        </div>
        {list.length === 0 ? (
          <div style={{padding:"60px 0", textAlign:"center", color:"var(--steel-2)"}}>
            <p style={{fontFamily:"var(--font-mono)", letterSpacing:".06em"}}>SIN RESULTADOS — prueba otra categoría o pídelo por WhatsApp.</p>
            <button className="btn btn-wa" onClick={()=>{ setSearch(""); setCat(""); setRegion(""); }}><Ico n="wa" s={16}/> Pedir por WhatsApp</button>
          </div>
        ) : (
          <div className="prod-grid">
            {list.map(p => <ProductCard key={p.id} p={p} inQuote={quote.some(q=>q.id===p.id)} add={add} img={images[p.sku] || DEFAULT_IMG[p.sku]} setImage={setImage} />)}
          </div>
        )}
      </div>
    </section>
  );
}

/* ---------------- offer ---------------- */
function Offer({ openQuote }) {
  return (
    <section className="offer">
      <div className="wrap">
        <div>
          <h2 className="big">HASTA <span>30% OFF</span><br/>EN REPUESTOS<br/>SELECCIONADOS</h2>
          <p>Frenos, baterías, suspensión y motor con descuento. Stock limitado — arma tu cotización hoy.</p>
        </div>
        <button className="btn btn-ink" onClick={openQuote} style={{padding:"15px 26px", fontSize:15}}><Ico n="cart" s={17}/> Ver mi cotización</button>
      </div>
    </section>
  );
}

/* ---------------- steps ---------------- */
function Steps() {
  const steps = [
    { n:"01", icon:"search", h:"Busca tu pieza", p:"Filtra por marca, modelo y categoría, o escríbenos el número de parte." },
    { n:"02", icon:"chat",   h:"Cotiza por WhatsApp", p:"Arma tu lista y envíala. Confirmamos precio, disponibilidad y compatibilidad." },
    { n:"03", icon:"truck",  h:"Recibe en 24h", p:"Despachamos a todo Panamá en menos de un día. Tú sigues rodando." },
  ];
  return (
    <section className="block" id="como">
      <div className="wrap">
        <div className="sec-head"><div><p className="sec-eyebrow">Cómo funciona</p><h2 className="sec-title">Tres pasos, un día</h2></div></div>
        <div className="steps">
          {steps.map((s,i) => (
            <div className="step" key={s.n}>
              <div className="num">{s.n}</div>
              {i<2 && <div className="ln"><Ico n="arrow" s={20}/></div>}
              <div style={{color:"var(--red)", marginBottom:14}}><Ico n={s.icon} s={26}/></div>
              <h4>{s.h}</h4>
              <p>{s.p}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ---------------- wholesale ---------------- */
function Wholesale({ waLink }) {
  return (
    <section className="block">
      <div className="wrap">
        <div className="whole">
          <div className="txt">
            <p className="eyebrow">Talleres & revendedores</p>
            <h3>Precios de mayoreo para tu negocio</h3>
            <p>Si compras por volumen para tu taller o tienda, tenemos lista de precios especial, crédito y despacho prioritario.</p>
            <ul>
              <li><Ico n="check" s={18}/> Descuentos por volumen escalonados</li>
              <li><Ico n="check" s={18}/> Línea directa de pedidos por WhatsApp</li>
              <li><Ico n="check" s={18}/> Despacho prioritario en 24h</li>
            </ul>
            <a className="btn btn-wa" href={waLink("Hola GECKO, soy taller/revendedor y quiero la lista de precios de mayoreo.")} target="_blank" rel="noopener"><Ico n="wa" s={17}/> Solicitar lista de mayoreo</a>
          </div>
          <div className="side ph" data-label="foto · taller / bodega"></div>
        </div>
      </div>
    </section>
  );
}

/* ---------------- footer ---------------- */
function Footer({ waLink }) {
  return (
    <footer className="site" id="contacto">
      <div className="wrap">
        <div className="foot-grid">
          <div>
            <Logo />
            <p className="blurb">Gecko Labs Group, S.A. — la primera e-commerce de repuestos de autos en Panamá. Despacho en menos de 24 horas.</p>
          </div>
          <div className="foot-col">
            <h5>Catálogo</h5>
            {CATS.slice(0,5).map(c => <a key={c.key} href="#catalogo">{c.name}</a>)}
          </div>
          <div className="foot-col">
            <h5>Contacto</h5>
            <a href={waLink("Hola GECKO, quiero cotizar un repuesto.")} target="_blank" rel="noopener">WhatsApp</a>
            <div className="fi">Tel. <span className="foot-tbd">por definir</span></div>
            <div className="fi">@gecko.repuestos <span className="foot-tbd">por confirmar</span></div>
            <div className="fi">Email <span className="foot-tbd">por definir</span></div>
          </div>
          <div className="foot-col">
            <h5>Cobertura</h5>
            <div className="fi">Todo Panamá</div>
            <div className="fi">Despacho &lt; 24h</div>
            <div className="fi">Lun – Sáb</div>
            <div className="fi"><span className="foot-tbd">Dirección por definir</span></div>
          </div>
        </div>
        <div className="foot-bottom">
          <span>© 2026 Gecko Labs Group, S.A.</span>
          <div className="foot-pay"><span>YAPPY</span><span>ACH</span><span>VISA</span><span>MASTERCARD</span><span>EFECTIVO</span></div>
        </div>
      </div>
    </footer>
  );
}

/* ---------------- quote drawer ---------------- */
function Drawer({ open, close, quote, setQty, remove, waLink, images }) {
  const total = quote.reduce((s,q)=>s+q.price*q.qty, 0);
  const msg = useMemo(() => {
    if (!quote.length) return "";
    let t = "Hola GECKO 👋, quiero cotizar estos repuestos:%0A%0A";
    quote.forEach(q => { t += `• ${q.qty}x ${q.name} (${q.sku}) — ${money(q.price)}%0A`; });
    t += `%0ATotal referencia: ${money(total)}%0A%0A¿Disponibilidad y despacho?`;
    return t;
  }, [quote, total]);

  return (
    <>
      <div className={"scrim"+(open?" open":"")} onClick={close}></div>
      <aside className={"drawer"+(open?" open":"")}>
        <div className="dh">
          <h3>Tu cotización</h3>
          <button className="x" onClick={close}><Ico n="x" s={20}/></button>
        </div>
        <div className="items">
          {quote.length === 0 ? (
            <div className="empty">
              <Ico n="cart" s={48}/>
              <p>Aún no agregas repuestos.<br/>Explora el catálogo y arma tu lista.</p>
            </div>
          ) : quote.map(q => (
            <div className="qitem" key={q.id}>
              {(images && images[q.sku]) || DEFAULT_IMG[q.sku] ? <img className="qi-img" src={(images && images[q.sku]) || DEFAULT_IMG[q.sku]} alt="" /> : <div className="qi-img ph"></div>}
              <div>
                <h5>{q.name}</h5>
                <div className="qi-sku">{q.sku} · {q.region}</div>
                <div className="qty">
                  <button onClick={()=>setQty(q.id, q.qty-1)}>–</button>
                  <span>{q.qty}</span>
                  <button onClick={()=>setQty(q.id, q.qty+1)}>+</button>
                </div>
              </div>
              <div>
                <div className="qi-price">{money(q.price*q.qty)}</div>
                <button className="qi-rm" onClick={()=>remove(q.id)}>Quitar</button>
              </div>
            </div>
          ))}
        </div>
        {quote.length > 0 && (
          <div className="df">
            <div className="tot"><span className="tl">Total referencia</span><span className="tv">{money(total)}</span></div>
            <p className="note">Precio de referencia. Confirmamos disponibilidad, compatibilidad y despacho por WhatsApp.</p>
            <a className="btn btn-wa" href={`https://wa.me/${WA_NUMBER}?text=${msg}`} target="_blank" rel="noopener"><Ico n="wa" s={18}/> Enviar cotización por WhatsApp</a>
          </div>
        )}
      </aside>
    </>
  );
}

/* ---------------- app ---------------- */
function App() {
  const [search, setSearch] = useState("");
  const [cat, setCat] = useState("");
  const [region, setRegion] = useState("");
  const [quote, setQuote] = useState([]);
  const [drawer, setDrawer] = useState(false);
  const [toast, setToast] = useState("");
  const [images, setImages] = useState(loadImgs);
  const tRef = useRef();

  const setImage = (sku, url) => setImages(m => {
    const next = { ...m };
    if (url) next[sku] = url; else delete next[sku];
    saveImgs(next);
    return next;
  });

  const waLink = (text) => `https://wa.me/${WA_NUMBER}?text=${encodeURIComponent(text)}`;

  const showToast = (m) => {
    setToast(m); clearTimeout(tRef.current);
    tRef.current = setTimeout(()=>setToast(""), 2200);
  };

  const add = (p) => {
    setQuote(q => {
      const ex = q.find(x => x.id === p.id);
      if (ex) return q.map(x => x.id===p.id ? {...x, qty:x.qty+1} : x);
      return [...q, { ...p, qty:1 }];
    });
    showToast("Agregado a tu cotización");
  };
  const setQty = (id, n) => setQuote(q => n<=0 ? q.filter(x=>x.id!==id) : q.map(x=>x.id===id?{...x,qty:n}:x));
  const remove = (id) => setQuote(q => q.filter(x=>x.id!==id));

  return (
    <>
      <div className="announce">
        <div className="wrap">
          <span><b>Despacho en &lt; 24h</b> en todo Panamá</span>
          <span className="dot"></span>
          <span>Cotiza por WhatsApp</span>
          <span className="dot"></span>
          <span>Hasta <b>30% OFF</b></span>
        </div>
      </div>
      <Header search={search} setSearch={setSearch} quoteCount={quote.reduce((s,q)=>s+q.qty,0)} openQuote={()=>setDrawer(true)} />
      <Hero onSearch={(c)=>{ setCat(c); window.location.hash = "catalogo"; }} />
      <Regions region={region} setRegion={setRegion} />
      <Categories setCat={setCat} />
      <Catalog search={search} setSearch={setSearch} cat={cat} setCat={setCat} region={region} setRegion={setRegion} quote={quote} add={add} images={images} setImage={setImage} />
      <Offer openQuote={()=>setDrawer(true)} />
      <Steps />
      <Wholesale waLink={waLink} />
      <Footer waLink={waLink} />
      <Drawer open={drawer} close={()=>setDrawer(false)} quote={quote} setQty={setQty} remove={remove} waLink={waLink} images={images} />
      <div className={"toast"+(toast?" show":"")}><Ico n="check" s={17}/> {toast}</div>
    </>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<App />);
