/* global React, SFIcons, Header, HomeView, CatalogView, CartDrawer, CheckoutView, OrderConfirmed */
const { Truck: TruckF, Phone: PhoneF, MapPin: MapF } = SFIcons;

function Footer({ onCategory, onShop, onNav }) {
  const col = (title, items) => (
    <div>
      <div style={{ fontFamily: 'var(--font-display)', fontWeight: 700, fontSize: 13, letterSpacing: '.08em', textTransform: 'uppercase', color: 'rgba(255,255,255,.55)', marginBottom: 14 }}>{title}</div>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 9 }}>
        {items.map(([label, onClick]) => <a key={label} onClick={onClick} style={{ fontFamily: 'var(--font-body)', fontSize: 14, color: 'rgba(255,255,255,.82)', cursor: 'pointer' }}>{label}</a>)}
      </div>
    </div>
  );
  return (
    <footer style={{ background: 'var(--madeci-ink)', color: '#fff', marginTop: 40 }}>
      <div className="sf-footer-cols" style={{ maxWidth: 1280, margin: '0 auto', padding: '52px 24px 36px', display: 'grid', gridTemplateColumns: '1.4fr 1fr 1fr 1fr', gap: 40 }}>
        <div>
          <img src="assets/logo-horizontal-white.png" alt="MADECI" style={{ height: 44 }} />
          <p style={{ fontFamily: 'var(--font-body)', fontSize: 14, color: 'rgba(255,255,255,.7)', marginTop: 16, maxWidth: 280, lineHeight: 1.55 }}>
            Distribuidora mayorista de bebidas y licores para el comercio de San Antonio y alrededores.
          </p>
          <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginTop: 18, fontFamily: 'var(--font-body)', fontSize: 13.5, color: 'rgba(255,255,255,.82)' }}>
            <span style={{ display: 'flex', gap: 8, alignItems: 'center' }}><PhoneF size={15} stroke="var(--madeci-red)" /> WhatsApp +56 9 9443 7835</span>
            <span style={{ display: 'flex', gap: 8, alignItems: 'center' }}><PhoneF size={15} stroke="var(--madeci-red)" /> Call center 600 612 9877</span>
            <span style={{ display: 'flex', gap: 8, alignItems: 'center' }}><MapF size={15} stroke="var(--madeci-red)" /> Av. Cartagena 498, Cartagena</span>
          </div>
        </div>
        {col('Catálogo', [['Cervezas', () => onCategory('Cervezas')], ['Vinos', () => onCategory('Vinos')], ['Licores', () => onCategory('Licores')], ['Bebidas', () => onCategory('Bebidas')], ['Aguas', () => onCategory('Aguas')]])}
        {col('Empresa', [['Nosotros', () => onNav('about')], ['Cobertura de reparto', () => onNav('coverage')], ['Términos y condiciones', () => onNav('terms')], ['Contacto', () => onNav('contact')]])}
        {col('Clientes', [['Crear cuenta comercial', () => onNav('register')], ['Soporte', () => window.open('https://wa.me/56994437835', '_blank')], ['Preguntas frecuentes', () => onNav('faq')]])}
      </div>
      <div style={{ borderTop: '1px solid rgba(255,255,255,.12)' }}>
        <div style={{ maxWidth: 1280, margin: '0 auto', padding: '18px 24px', display: 'flex', justifyContent: 'space-between', fontFamily: 'var(--font-body)', fontSize: 12.5, color: 'rgba(255,255,255,.5)' }}>
          <span>© 2026 MADECI · Distribuidora de Bebidas y Licores</span>
          <span style={{ display: 'flex', alignItems: 'center', gap: 7 }}><TruckF size={14} /> Beba con moderación · Venta exclusiva a mayores de 18 años</span>
        </div>
      </div>
    </footer>
  );
}

function App() {
  const data = window.SF_DATA;
  // Si la URL trae ?token=... (enlace del correo de contraseña), arrancamos en la pantalla de crear clave.
  const [resetToken] = React.useState(() => {
    try { return new URLSearchParams(window.location.search).get('token'); } catch (e) { return null; }
  });
  const [view, setView] = React.useState(resetToken ? 'reset' : 'home'); // home | catalog | product | account | checkout | done | reset
  // El carrito se guarda en el navegador para que no se pierda al recargar o volver atrás.
  const [cart, setCart] = React.useState(() => {
    try { return JSON.parse(localStorage.getItem('madeci_cart') || '[]'); }
    catch (e) { return []; }
  });
  React.useEffect(() => {
    try { localStorage.setItem('madeci_cart', JSON.stringify(cart)); } catch (e) {}
  }, [cart]);
  const [drawer, setDrawer] = React.useState(false);
  const [query, setQuery] = React.useState('');
  const [catFilter, setCatFilter] = React.useState('all');
  const [selected, setSelected] = React.useState(null);
  const [acctTab, setAcctTab] = React.useState('resumen');
  const [loggedIn, setLoggedIn] = React.useState(false);
  const [ordered, setOrdered] = React.useState(false);
  const [ultimoPedido, setUltimoPedido] = React.useState(null); // nº del pedido recién creado
  // Productos/categorías: arrancan con los datos demo y se reemplazan por los reales al loguearse.
  const [products, setProducts] = React.useState(data.products);
  const [categories, setCategories] = React.useState(data.categories);
  const [account, setAccount] = React.useState(null); // cuenta REAL del cliente logueado
  const [orders, setOrders] = React.useState([]);     // pedidos REALES del cliente logueado

  // Trae el catálogo real del backend y lo deja en formato del diseño.
  const cargarCatalogo = async () => {
    const crudos = await window.MadeciAPI.getCatalogo();
    setProducts(crudos.map(window.MadeciAPI.mapProducto));
    setCategories(window.MadeciAPI.categoriasDesde(crudos.map(window.MadeciAPI.mapProducto)));
  };

  // Catálogo real PERO SIN PRECIOS, para visitantes sin sesión.
  const cargarCatalogoPublico = async () => {
    const crudos = await window.MadeciAPI.getCatalogoPublico();
    setProducts(crudos.map(window.MadeciAPI.mapProducto));
    setCategories(window.MadeciAPI.categoriasDesde(crudos.map(window.MadeciAPI.mapProducto)));
  };

  // Carga la cuenta real (ficha completa) y el historial de pedidos del cliente logueado.
  const cargarCuenta = async () => {
    const ficha = await window.MadeciAPI.getFicha();
    if (ficha && ficha.cliente) setAccount(window.MadeciAPI.cuentaDesde(ficha.cliente));
    const peds = await window.MadeciAPI.getMisPedidos();
    setOrders(peds.map(window.MadeciAPI.mapPedido));
  };

  // Al cargar la página: si hay sesión, catálogo con precios + cuenta real; si no, catálogo público (sin precios).
  React.useEffect(() => {
    window.MadeciAPI.me().then((cliente) => {
      if (cliente) { setLoggedIn(true); cargarCatalogo().catch(() => {}); cargarCuenta().catch(() => {}); }
      else { cargarCatalogoPublico().catch(() => {}); }
    }).catch(() => { cargarCatalogoPublico().catch(() => {}); });
  }, []);

  // Cada vez que se entra a "Mi cuenta", refresca la ficha y los pedidos (así se ve el
  // estado actualizado que cambió el ejecutivo, sin tener que recargar la página).
  React.useEffect(() => {
    if (view === 'account' && loggedIn) cargarCuenta().catch(() => {});
  }, [view]);

  // EN LÍNEA: mientras haya sesión, refresca los pedidos cada 25 s (solo si la pestaña
  // está visible) para que los cambios de estado aparezcan solos, sin recargar.
  React.useEffect(() => {
    if (!loggedIn) return;
    const tick = () => {
      if (typeof document !== 'undefined' && document.visibilityState !== 'visible') return;
      window.MadeciAPI.getMisPedidos()
        .then((peds) => setOrders(peds.map(window.MadeciAPI.mapPedido)))
        .catch(() => {});
    };
    const id = setInterval(tick, 25000);
    return () => clearInterval(id);
  }, [loggedIn]);

  // Cantidad que YA hay en el carrito de un producto (según la unidad). 0 si no está.
  const qtyEnCarrito = (sku, modo) => {
    const unidad = modo === 'UN' ? 'UN' : 'CJ';
    const l = cart.find((i) => i.id === sku + ':' + unidad);
    return l ? l.qty : 0;
  };
  // modo: 'CJ' (por caja, default) o 'UN' (por unidad, solo si el producto lo permite).
  // FIJA la cantidad elegida (no suma): así el cliente actualiza a lo que quiere y no envía de más por error.
  const addToCart = (p, qty, modo) => {
    if (!loggedIn) { setView('login'); window.scrollTo(0, 0); return; }
    const unidad = modo === 'UN' ? 'UN' : 'CJ';
    // Precio efectivo (aplica descuento por volumen si el producto tiene escala).
    const price = window.MadeciAPI.precioEfectivo(p, unidad, qty);
    const pack = unidad === 'UN' ? (p.unitPack || 'Unidad') : (p.cajaPack || p.pack);
    const lineId = p.sku + ':' + unidad; // UN y CJ del mismo producto son líneas distintas
    setCart((c) => {
      const ex = c.find((i) => i.id === lineId);
      // FIJA la cantidad (no suma) y recalcula el precio según el tramo de volumen.
      if (ex) return c.map((i) => i.id === lineId ? { ...i, qty, price: window.MadeciAPI.precioEfectivo(i, unidad, qty) } : i);
      return [...c, { ...p, id: lineId, sku: p.sku, unidad, price, pack, qty }];
    });
    setDrawer(true);
  };
  const setQty = (id, qty) => setCart((c) => c.map((i) => i.id === id ? { ...i, qty, price: window.MadeciAPI.precioEfectivo(i, i.unidad, qty) } : i));
  const remove = (id) => setCart((c) => c.filter((i) => i.id !== id));
  const count = cart.reduce((s, i) => s + i.qty, 0);
  const go = (v) => { setView(v); window.scrollTo(0, 0); };
  const openProduct = (p) => {
    setSelected(p); go('product');
    // Traemos las imágenes de galería (solo para la ficha) y las adjuntamos al producto.
    window.MadeciAPI.getImagenes(p.sku).then((galeria) => {
      setSelected((actual) => (actual && actual.id === p.id ? { ...actual, galeria } : actual));
    }).catch(() => {});
  };
  // Repetir un pedido: carga sus productos al carrito con el PRECIO ACTUAL del catálogo.
  const repetirPedido = async (orderId) => {
    const det = await window.MadeciAPI.getPedido(orderId);
    if (!det || !det.items) return { agregados: 0, faltan: 0 };
    let agregados = 0, faltan = 0;
    det.items.forEach((it) => {
      const prod = products.find((p) => p.sku === it.sku); // producto actual = precio actual
      if (prod && prod.stockStatus !== 'out') { addToCart(prod, it.cantidad, it.unidad === 'UN' ? 'UN' : 'CJ'); agregados++; }
      else faltan++;
    });
    return { agregados, faltan };
  };
  // Cancelar un pedido no confirmado (queda 'anulado' en el historial) y refrescar la lista.
  const cancelarPedido = async (orderId) => {
    await window.MadeciAPI.cancelarPedido(orderId);
    const peds = await window.MadeciAPI.getMisPedidos();
    setOrders(peds.map(window.MadeciAPI.mapPedido));
  };
  const related = selected ? products.filter((x) => x.category === selected.category && x.id !== selected.id).slice(0, 4) : [];
  const logout = () => { window.MadeciAPI.logout().catch(() => {}); setDrawer(false); setCart([]); setLoggedIn(false); setAccount(null); setOrders([]); cargarCatalogoPublico().catch(() => {}); go('home'); };
  // Login REAL: valida contra el backend; si anda, carga catálogo real + cuenta real. Lanza error si falla (lo muestra LoginView).
  const login = async (rut, pass) => {
    await window.MadeciAPI.login(rut, pass);
    setLoggedIn(true);
    await cargarCatalogo();
    cargarCuenta().catch(() => {});
    go('home');
  };
  const hasActivity = cart.length > 0 || ordered;

  // La página de crear/recuperar contraseña es una pantalla LIMPIA, sin encabezado ni buscador
  // (así el autocompletar del navegador no puede meter el RUT en la búsqueda y desviar la página).
  if (view === 'reset') {
    return <ResetView token={resetToken} onDone={() => { try { window.history.replaceState({}, '', '/storefront/'); } catch (e) {} go('login'); }} />;
  }

  return (
    <div>
      <Header cartCount={count} categories={categories} onCart={() => setDrawer(true)} onLogo={() => go('home')} onAccount={() => go('account')} onLogout={logout} onEnter={() => go('login')} onShop={() => { setQuery(''); setCatFilter('all'); go('catalog'); }} onCategory={(c) => { setQuery(''); setCatFilter(c); go('catalog'); }} loggedIn={loggedIn} account={account} query={query} setQuery={(q) => { setQuery(q); if (q) go('catalog'); }} />
      {view === 'home' && <HomeView products={products} onAdd={addToCart} qtyEnCarrito={qtyEnCarrito} onShop={() => go('catalog')} onView={openProduct} loggedIn={loggedIn} onLogin={() => go('login')} showExec={loggedIn && !hasActivity} account={account} />}
      {view === 'catalog' && <CatalogView products={products} categories={categories} onAdd={addToCart} qtyEnCarrito={qtyEnCarrito} onView={openProduct} query={query} setQuery={setQuery} initialCat={catFilter} loggedIn={loggedIn} onLogin={() => go('login')} />}
      {view === 'product' && <ProductView product={selected} related={related} onAdd={addToCart} qtyEnCarrito={qtyEnCarrito} onView={openProduct} onShop={() => go('catalog')} loggedIn={loggedIn} onLogin={() => go('login')} />}
      {view === 'login' && <LoginView onLogin={login} onRegister={() => go('register')} />}
      {view === 'register' && <RegisterView onBack={() => go('login')} onHome={() => go('home')} onSubmit={() => {}} />}
      {view === 'account' && <AccountView account={account} orders={orders} invoices={[]} frequent={[]} favorites={[]} products={products} onAdd={addToCart} onRepeat={repetirPedido} onCancel={cancelarPedido} onShop={() => go('catalog')} onLogout={logout} />}
      {view === 'checkout' && <CheckoutView items={cart} account={account} onBack={() => go('catalog')} onPlace={async (despacho, observaciones) => {
        const payload = { items: cart.map((i) => ({ sku: i.sku, unidad: i.unidad || 'CJ', cantidad: i.qty })), despacho, observaciones: observaciones || undefined };
        const res = await window.MadeciAPI.crearPedido(payload); // lanza error si falla (lo muestra CheckoutView)
        setUltimoPedido(res.pedido_id);
        setOrdered(true);
        setCart([]);
        cargarCuenta().catch(() => {}); // refresca "Mis pedidos" con el pedido recién creado
        go('done');
      }} />}
      {view === 'done' && <OrderConfirmed pedidoId={ultimoPedido} onHome={() => { go('home'); }} />}
      {view === 'about' && <AboutView onShop={() => { setQuery(''); setCatFilter('all'); go('catalog'); }} />}
      {view === 'coverage' && <CoverageView />}
      {view === 'terms' && <TermsView />}
      {view === 'contact' && <ContactView />}
      {view === 'faq' && <FaqView />}
      {view !== 'checkout' && view !== 'done' && view !== 'login' && view !== 'register' && view !== 'reset' && <Footer onCategory={(c) => { setQuery(''); setCatFilter(c); go('catalog'); }} onShop={() => { setQuery(''); setCatFilter('all'); go('catalog'); }} onNav={go} />}
      <CartDrawer open={drawer} items={cart} onClose={() => setDrawer(false)} onQty={setQty} onRemove={remove} onClear={() => setCart([])} onCheckout={() => { setDrawer(false); go('checkout'); }} />
    </div>
  );
}

Object.assign(window, { App });

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