// Componentes compartidos — Auto Paniagua
const { useState, useEffect, useRef } = React;

const fmtUSD = (n) => "US$ " + n.toLocaleString("en-US");
const fmtKm = (n) => n === 0 ? "0 km" : n.toLocaleString("es-DO") + " km";
const WA_NUMBER = "18094827301";
const waLink = (msg) => `https://wa.me/${WA_NUMBER}?text=${encodeURIComponent(msg)}`;

// ---- Logo (oficial) ----
function Logo({ size = 30, onClick }) {
  return (
    <button className="ap-logo" onClick={onClick} aria-label="Auto Paniagua — Inicio">
      <img className="ap-logo-img" src="assets/logo-paniagua.png" alt="Auto Paniagua"
      style={{ height: size + "px" }} />
    </button>);

}

// ---- Botón ----
function Btn({ children, variant = "primary", size = "md", icon, iconRight, onClick, href, className = "", ...p }) {
  const cls = `ap-btn ap-btn-${variant} ap-btn-${size} ${className}`;
  const inner = <>
    {icon ? <span className="ap-btn-ico">{icon}</span> : null}
    <span>{children}</span>
    {iconRight ? <span className="ap-btn-ico">{iconRight}</span> : null}
  </>;
  if (href) return <a className={cls} href={href} target="_blank" rel="noopener" onClick={onClick} {...p}>{inner}</a>;
  return <button className={cls} onClick={onClick} {...p}>{inner}</button>;
}

// ---- Spec chip ----
function Spec({ icon, label }) {
  return (
    <span className="ap-spec">
      <span className="ap-spec-ico">{icon}</span>
      <span>{label}</span>
    </span>);

}

// ---- Tarjeta de vehículo ----
const FAVS_KEY = "ap-favs-v3";
function getFavs() { try { return JSON.parse(localStorage.getItem(FAVS_KEY) || "[]"); } catch { return []; } }

function CarCard({ v, onOpen }) {
  const tagClass = v.condicion === "nuevo" ? "ap-tag-new" : "ap-tag-used";
  const [faved, setFaved] = useState(() => getFavs().includes(v.id));

  const toggleFav = (e) => {
    e.stopPropagation();
    const favs = getFavs();
    const next = faved ? favs.filter((id) => id !== v.id) : [...favs, v.id];
    try { localStorage.setItem(FAVS_KEY, JSON.stringify(next)); } catch {}
    setFaved(!faved);
    window.dispatchEvent(new CustomEvent("ap-favs-changed"));
  };

  return (
    <article className="ap-card" onClick={() => onOpen(v)}>
      <div className="ap-card-media">
        <img src={v.img} alt={`${v.marca} ${v.modelo} ${v.anio}`} loading="lazy" />
        <span className={`ap-card-cond ${tagClass}`}>{v.condicion}</span>
        <button className={`ap-card-fav ${faved ? "is-faved" : ""}`} onClick={toggleFav} aria-label="Guardar">
          {Icons.heart({ size: 17 })}
        </button>
        <div className="ap-card-shade"></div>
      </div>
      <div className="ap-card-body">
        <div className="ap-card-head">
          <p className="ap-card-brand">{v.marca}</p>
          <h3 className="ap-card-title">{v.modelo}</h3>
        </div>
        <div className="ap-card-specs">
          <Spec icon={Icons.calendar({ size: 15 })} label={v.anio} />
          <Spec icon={Icons.gauge({ size: 15 })} label={fmtKm(v.km)} />
          <Spec icon={Icons.fuel({ size: 15 })} label={v.combustible} />
        </div>
        <div className="ap-card-foot">
          <div>
            <p className="ap-card-price-label">Precio</p>
            <p className="ap-card-price">{fmtUSD(v.precio)}</p>
          </div>
          <span className="ap-card-cta">{Icons.arrowRight({ size: 18 })}</span>
        </div>
      </div>
    </article>);

}

// ---- Header ----
function Header({ go, current, theme, toggleTheme }) {
  const [scrolled, setScrolled] = useState(false);
  const [openMenu, setOpenMenu] = useState(false);
  const [favsCount, setFavsCount] = useState(() => getFavs().length);
  useEffect(() => {
    const onFavsChanged = () => setFavsCount(getFavs().length);
    window.addEventListener("ap-favs-changed", onFavsChanged);
    return () => window.removeEventListener("ap-favs-changed", onFavsChanged);
  }, []);
  useEffect(() => {
    const root = document.querySelector(".ap-scroll");
    const el = root || window;
    const onScroll = () => setScrolled((root ? root.scrollTop : window.scrollY) > 12);
    el.addEventListener("scroll", onScroll);
    onScroll();
    return () => el.removeEventListener("scroll", onScroll);
  }, []);
  const nav = [
  { id: "home", label: "Inicio" },
  { id: "listing", label: "Vehículos" },
  { id: "calculator", label: "Calculadora" },
  { id: "contacto", label: "Contacto" }];

  return (
    <>
      <div className="ap-topbar">
        <div className="ap-wrap ap-topbar-in">
          <span className="ap-topbar-item">{Icons.pin({ size: 14 })} Ave. Rómulo Betancourt #2080, Santo Domingo</span>
          <div className="ap-topbar-right">
            <a className="ap-topbar-item" href="tel:+18094827301">{Icons.phone({ size: 14 })} 809-482-7301</a>
            <span className="ap-topbar-sep"></span>
            <span className="ap-topbar-item ap-topbar-since">Líderes desde 1994</span>
          </div>
        </div>
      </div>
      <header className={`ap-header ${scrolled ? "is-scrolled" : ""}`}>
        <div className="ap-wrap ap-header-in">
          <Logo size={30} onClick={() => go("home")} />
          <nav className="ap-nav">
            {nav.map((n) =>
            <button key={n.id} className={`ap-nav-link ${current === n.id ? "is-active" : ""}`}
            onClick={() => go(n.id)}>{n.label}</button>
            )}
          </nav>
          <div className="ap-header-actions">
            {favsCount > 0 && (
              <button className="ap-icon-btn ap-fav-header-btn ap-hide-sm" onClick={() => go("listing", { favs: true })} aria-label="Mis favoritos">
                {Icons.heart({ size: 18 })}
                <span className="ap-fav-badge">{favsCount}</span>
              </button>
            )}
            <button className="ap-icon-btn" onClick={toggleTheme} aria-label="Cambiar tema">
              {theme === "light" ? Icons.moon({ size: 18 }) : Icons.sun({ size: 18 })}
            </button>
            <button className="ap-icon-btn ap-hide-sm" onClick={() => go("listing")} aria-label="Buscar">
              {Icons.search({ size: 19 })}
            </button>
            <Btn variant="primary" size="sm" className="ap-hide-sm"
            icon={Icons.whatsapp({ size: 16 })} href={waLink("Hola Auto Paniagua, quisiera información sobre un vehículo.")}>
              Cotiza ahora
            </Btn>
            <button className="ap-icon-btn ap-show-sm" onClick={() => setOpenMenu(true)} aria-label="Menú">
              {Icons.menu({ size: 22 })}
            </button>
          </div>
        </div>
      </header>
      {openMenu ?
      <div className="ap-mobile-menu" onClick={() => setOpenMenu(false)}>
          <div className="ap-mobile-panel" onClick={(e) => e.stopPropagation()}>
            <div className="ap-mobile-top">
              <Logo size={28} onClick={() => {go("home");setOpenMenu(false);}} />
              <button className="ap-icon-btn" onClick={() => setOpenMenu(false)}>{Icons.close({ size: 22 })}</button>
            </div>
            {nav.map((n) =>
          <button key={n.id} className="ap-mobile-link" onClick={() => {go(n.id);setOpenMenu(false);}}>
                {n.label} {Icons.chevronRight({ size: 18 })}
              </button>
          )}
            <Btn variant="primary" size="md" className="ap-mobile-cta"
          icon={Icons.whatsapp({ size: 18 })} href={waLink("Hola Auto Paniagua, quisiera información.")}>
              Cotiza por WhatsApp
            </Btn>
          </div>
        </div> :
      null}
    </>);

}

// ---- Footer ----
function Footer({ go }) {
  const D = window.AP_DATA;
  return (
    <footer className="ap-footer">
      <div className="ap-wrap">
        <div className="ap-footer-grid">
          <div className="ap-footer-brand">
            <Logo size={32} onClick={() => go("home")} />
            <p className="ap-footer-desc">Líderes en venta de vehículos nuevos y semi-nuevos en República Dominicana, brindando el mejor servicio desde 1994.</p>
            <div className="ap-footer-social">
              <a className="ap-social" href="https://www.facebook.com/AutoPaniagua/" target="_blank" rel="noopener" aria-label="Facebook">{Icons.facebook({ size: 17 })}</a>
              <a className="ap-social" href="https://www.instagram.com/autopaniagua/" target="_blank" rel="noopener" aria-label="Instagram">{Icons.instagram({ size: 17 })}</a>
              <a className="ap-social" href={waLink("Hola Auto Paniagua")} target="_blank" rel="noopener" aria-label="WhatsApp">{Icons.whatsapp({ size: 17 })}</a>
            </div>
          </div>
          <div className="ap-footer-col">
            <h4 style={{ color: "rgb(255, 255, 255)" }}>Marcas</h4>
            {["Toyota", "Mercedes-Benz", "Kia", "Mazda", "Hyundai", "Honda"].map((m) =>
            <button key={m} className="ap-footer-link" onClick={() => go("listing", { marca: m })}>{m}</button>
            )}
          </div>
          <div className="ap-footer-col">
            <h4 style={{ color: "rgb(255, 255, 255)" }}>Sucursales</h4>
            {D.SUCURSALES.map((s) =>
            <a key={s.nombre} className="ap-footer-link" href={s.maps} target="_blank" rel="noopener">{s.nombre}</a>
            )}
          </div>
          <div className="ap-footer-col">
            <h4 style={{ color: "rgb(255, 255, 255)" }}>Contacto</h4>
            <a className="ap-footer-link" href="tel:+18094827301">{Icons.phone({ size: 14 })} 809-482-7301</a>
            <a className="ap-footer-link" href="mailto:info@autopaniagua.com">{Icons.mail({ size: 14 })} info@autopaniagua.com</a>
            <span className="ap-footer-link">{Icons.pin({ size: 14 })} Ave. Rómulo Betancourt #2080</span>
            <span className="ap-footer-link">{Icons.clock({ size: 14 })} Lun–Sáb · 9:00 a 6:00</span>
          </div>
        </div>
        <div className="ap-footer-bottom">
          <span>© 2025 Auto Paniagua. Todos los derechos reservados.</span>
          <a href="https://cubik.online" target="_blank" rel="noopener noreferrer" className="ap-footer-cubik">
            <span className="ap-footer-cubik-text">Creado por</span>
            <svg width="20" height="20" viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg">
              <g transform="matrix(0.577656,-0.694408,0.26725,0.222317,13.878828,60.572553)">
                <path d="M7.061,4.002C7.077,4.001 7.092,4 7.107,4L26.893,4C27.504,4 28,5.289 28,6.877L28,7.123C28,8.711 27.504,10 26.893,10L9.426,10L7.836,5.032C7.635,4.404 7.352,4.055 7.061,4.002Z" fill="rgb(123,97,255)" fillOpacity="0.7"/>
              </g>
              <g transform="matrix(0.577656,-0.694408,0.26725,0.222317,2.564285,94.437502)">
                <path d="M25.793,10L9.592,10L80.904,232.744C81.295,233.965 81.231,235.78 80.761,236.795L63.313,274.508C62.844,275.524 62.145,275.357 61.754,274.136L-11.171,46.355C-11.561,45.135 -11.497,43.32 -11.027,42.304L6.42,4.591C6.696,3.995 7.051,3.806 7.377,4L26.169,4L25.662,5.095C25.193,6.11 25.129,7.926 25.519,9.146L25.793,10Z" fill="currentColor" fillOpacity="0.4"/>
              </g>
              <g transform="matrix(3.75,0,0,3.75,7.5,7.5)">
                <path d="M28,13.267L28,18.733C28,18.733 27.881,19 27.733,19L3.267,19C3.119,19 3,18.881 3,18.733L3,13.267C3,13.119 3.119,13 3.267,13L27.733,13C27.881,13 28,13.119 28,13.267Z" fill="currentColor" fillOpacity="0.8"/>
                <path d="M28,4.267L28,9.733C28,9.881 27.881,10 27.733,10L6.267,10C6.119,10 6,9.881 6,9.733L6,4.267C6,4.119 6.119,4 6.267,4L27.733,4C27.881,4 28,4.119 28,4.267Z" fill="rgb(123,97,255)"/>
              </g>
            </svg>
            <span className="ap-footer-cubik-name">Cubik</span>
          </a>
          <span className="ap-footer-bottom-links">
            <button className="ap-footer-mini" onClick={() => go("terminos")}>Términos</button>
            <button className="ap-footer-mini" onClick={() => go("privacidad")}>Privacidad</button>
          </span>
        </div>
      </div>
    </footer>);

}

// ---- Sección título ----
function SectionHead({ overline, title, action, onAction }) {
  return (
    <div className="ap-sechead">
      <div>
        {overline ? <p className="ap-overline">{overline}</p> : null}
        <h2 className="ap-sectitle">{title}</h2>
      </div>
      {action ?
      <button className="ap-sechead-action" onClick={onAction}>
          {action} {Icons.arrowRight({ size: 17 })}
        </button> :
      null}
    </div>);

}

// ---- Botón flotante WhatsApp ----
function WhatsAppFab() {
  return (
    <a className="ap-wa-fab" href={waLink("Hola Auto Paniagua, quisiera información sobre sus vehículos.")}
    target="_blank" rel="noopener" aria-label="WhatsApp">
      {Icons.whatsapp({ size: 28 })}
      <span className="ap-wa-pulse"></span>
    </a>);

}

// Select con búsqueda. options: array de strings o {value, label}.
function SearchSelect({ value, onChange, options, placeholder, className }) {
  const [open, setOpen] = useState(false);
  const [q, setQ] = useState("");
  const ref = useRef(null);
  const opts = (options || []).map((o) => (typeof o === "object" ? o : { value: o, label: String(o) }));
  const current = opts.find((o) => String(o.value) === String(value));
  useEffect(() => {
    if (!open) return undefined;
    const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    const onKey = (e) => { if (e.key === "Escape") setOpen(false); };
    document.addEventListener("mousedown", onDoc);
    document.addEventListener("keydown", onKey);
    return () => { document.removeEventListener("mousedown", onDoc); document.removeEventListener("keydown", onKey); };
  }, [open]);
  const filtered = q ? opts.filter((o) => o.label.toLowerCase().includes(q.toLowerCase())) : opts;
  return (
    <div className={`ap-ss ${open ? "is-open" : ""} ${className || ""}`} ref={ref}>
      <button type="button" className="ap-ss-btn" onClick={() => { setOpen((v) => !v); setQ(""); }}>
        <span className={current ? "" : "ap-ss-ph"}>{current ? current.label : (placeholder || "Selecciona")}</span>
        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="m6 9 6 6 6-6" /></svg>
      </button>
      {open ? (
        <div className="ap-ss-panel">
          <input className="ap-ss-search" autoFocus placeholder="Buscar…" value={q} onChange={(e) => setQ(e.target.value)} />
          <div className="ap-ss-list">
            {filtered.length ? filtered.map((o) => (
              <button type="button" key={String(o.value)} className={`ap-ss-opt ${String(o.value) === String(value) ? "is-sel" : ""}`}
                onClick={() => { onChange(o.value); setOpen(false); }}>{o.label}</button>
            )) : <div className="ap-ss-empty">Sin resultados</div>}
          </div>
        </div>
      ) : null}
    </div>
  );
}

Object.assign(window, { fmtUSD, fmtKm, waLink, WA_NUMBER, getFavs, Logo, Btn, Spec, CarCard, Header, Footer, SectionHead, WhatsAppFab, SearchSelect });