import { initializeChat as serviceInitializeChat, sendMessage as serviceSendMessage, sendOrder, getProducts, existsUser } from './service.js'; let userName = ''; let userTable = null; let products = []; let itsEmpty = true; let cart = []; let chatHistory = [ { role: "system", content: "¡Hola! Soy tu asistente en Biergarten Klein. ¿Te gustaría una recomendación de nuestras cervezas artesanales?" } ]; // --- Elementos del DOM --- const productListElement = document.getElementById("productList"); const cartItemsElement = document.getElementById("cartItems"); const cartTotalElement = document.getElementById("cartTotal"); const emptyCartTextElement = document.getElementById("emptyCartText"); const checkoutButton = document.getElementById("checkoutButton"); const originalCheckoutButtonText = checkoutButton ? checkoutButton.textContent : "Finalizar Pedido"; console.log(originalCheckoutButtonText) const chatMessagesElement = document.getElementById("chatMessages"); const chatInputElement = document.getElementById("chatInput"); const sendChatButton = document.getElementById("sendChatButton"); const aiLoadingIndicator = document.getElementById("aiLoadingIndicator"); const cartCountElement = document.getElementById("cartCount"); // --- Loader Global --- let globalLoaderElement = null; function createGlobalLoader() { if (document.getElementById('globalLoader')) return; globalLoaderElement = document.createElement('div'); globalLoaderElement.id = 'globalLoader'; globalLoaderElement.className = 'fixed inset-0 bg-black bg-opacity-80 flex flex-col items-center justify-center z-[2000] transition-opacity duration-300 ease-in-out pointer-events-none'; globalLoaderElement.style.opacity = '0'; globalLoaderElement.innerHTML = `
Procesando su pedido...
`; document.body.appendChild(globalLoaderElement); } function showGlobalLoader() { if (!globalLoaderElement) createGlobalLoader(); globalLoaderElement.style.display = 'flex'; setTimeout(() => { if (globalLoaderElement) globalLoaderElement.style.opacity = '1'; }, 10); } function hideGlobalLoader() { if (globalLoaderElement) { globalLoaderElement.style.opacity = '0'; setTimeout(() => { if (globalLoaderElement) globalLoaderElement.style.display = 'none'; }, 300); } } function formatPrice(price) { return price.toLocaleString("es-CL", { style: "currency", currency: "CLP" }); } async function processOrder() { if (cart.length === 0) return; showGlobalLoader(); if (checkoutButton) { checkoutButton.disabled = true; checkoutButton.textContent = "Procesando..."; } try { const orderData = { customerName: userName, table: userTable, items: cart.map(item => ({ id: item.id, name: item.name, quantity: item.quantity, price: item.price, itemTotal: item.price * item.quantity })), totalAmount: cart.reduce((sum, item) => sum + item.price * item.quantity, 0), orderDate: new Date().toLocaleString('sv-SE').replace(' ', 'T') }; console.log("Enviando Pedido:", orderData); await sendOrder(orderData); alert("Pedido enviado con éxito."); cart = [] updateCartDisplay(); } catch (error) { console.error("Error al procesar la orden:", error); alert(`Hubo un problema: ${error.message || "Por favor, inténtalo de nuevo."}`); } finally { hideGlobalLoader(); checkoutButton.disabled = cart.length === 0; checkoutButton.textContent = originalCheckoutButtonText } } async function renderProducts() { if (!productListElement) return; const template = document.getElementById("product-card-template"); if (!template) return; productListElement.innerHTML = ""; products = await getProducts(); products.forEach(product => { const clone = template.content.cloneNode(true); clone.querySelector(".product-type").textContent = product.type || "Sin categoría"; clone.querySelector(".product-name").textContent = product.name; clone.querySelector(".product-description").textContent = product.description; clone.querySelector(".product-price").textContent = formatPrice(product.price); clone.querySelector(".product-image").style.backgroundImage = `url('${product.image}')`; const addBtn = clone.querySelector(".add-to-cart-btn"); addBtn.dataset.productId = product.id; // el listener usa esta info productListElement.appendChild(clone); }); document.querySelectorAll('.add-to-cart-btn').forEach(button => { button.addEventListener('click', (event) => { const productId = parseInt(event.target.dataset.productId); addToCart(productId, event.target); }); }); } window.addToCart = async (productId, buttonElement = null) => { const product = products.find(p => p.id === productId); if (!product) return; const cartItem = cart.find(item => item.id === productId); if (cartItem) { cartItem.quantity++; } else { cart.push({ ...product, quantity: 1 }); } if (buttonElement) { const originalHTML = buttonElement.innerHTML; buttonElement.textContent = "✔ Agregado!"; buttonElement.classList.replace('bg-accent-red', 'bg-green-500'); buttonElement.classList.remove("hover:bg-red-700"); buttonElement.disabled = true; setTimeout(() => { buttonElement.innerHTML = originalHTML; buttonElement.classList.replace('bg-green-500', 'bg-accent-red'); buttonElement.classList.add("hover:bg-red-700"); buttonElement.disabled = false; }, 1500); } updateCartDisplay(); // Dentro de window.addToCart (después de updateCartDisplay()) if (typeof showToast === "function") showToast(`${product.name} agregado al carrito`); }; window.removeFromCart = (productId, removeAll = false) => { const itemIndex = cart.findIndex(item => item.id === productId); if (itemIndex > -1) { if (removeAll || cart[itemIndex].quantity === 1) { cart.splice(itemIndex, 1); } else { cart[itemIndex].quantity--; } } updateCartDisplay(); }; function updateCartDisplay() { if (!cartItemsElement || !emptyCartTextElement || !checkoutButton || !cartCountElement) return; cartItemsElement.innerHTML = ""; cartCountElement.textContent = cart.reduce((sum, item) => sum + item.quantity, 0); if (cart.length === 0) { cartCountElement.classList.add("hidden"); emptyCartTextElement.classList.remove("hidden"); checkoutButton.disabled = true; itsEmpty = true; } else { cartCountElement.classList.remove("hidden"); if (cartCountElement && itsEmpty) { itsEmpty = false; cartCountElement.animate([ { transform: 'scale(0)' }, { transform: 'scale(1)' } ],{ duration: 300, iterations: 1, easing: 'ease-in-out' }) }else { cartCountElement.animate([ { transform: 'scale(1) rotate(0deg)' }, { transform: 'scale(1.2) rotate(180deg)' }, { transform: 'scale(1) rotate(360deg)' } ], { duration: 300, iterations: 1, easing: 'ease-in-out' }) } emptyCartTextElement.classList.add("hidden"); checkoutButton.disabled = false; cart.forEach(item => { const cartItemHTML = `${formatPrice(item.price * item.quantity)}