import { sendMessage as serviceSendMessage } from './service/chat.js'; import { getProducts, sendOrder } from './service/product.js'; import { login } from './service/auth.js' import { createGlobalLoader, showGlobalLoader, hideGlobalLoader } from './utils/loader.js'; import { showError } from './utils/error.js'; import { addHistoryRow, setupShoppingCart } from './utils/shoppingCart.js'; // --- Variables de Usuario --- let userId = -1; let userName = "Cliente"; let userTable = null; let userToken = null; // --- Datos de Productos y Carrito --- let products = []; let cart = []; let itsEmpty = true; // --- Historial de Chat --- 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: Productos y Carrito --- 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"; const cartCountElement = document.getElementById("cartCount"); // --- Elementos del DOM: Chat --- const chatMessagesElement = document.getElementById("chatMessages"); const chatInputElement = document.getElementById("chatInput"); const chatForm = document.getElementById("chatForm"); const aiLoadingIndicator = document.getElementById("aiLoadingIndicator"); const chatSuggestionsElement = document.getElementById("chatSuggestions"); //#region --- Inicialización y Configuracion --- async function initializeApp() { updateCartDisplay(); initializeChat(); setupBasicListeners(); showGlobalLoader("Cargando productos..."); setupShoppingCart(userId, userToken,userName); await renderProducts(); hideGlobalLoader(); const chatSuggestions = Array.from(chatSuggestionsElement.children); chatSuggestions.forEach(suggestion => { suggestion.addEventListener("click", () => { sendSuggestion(suggestion.querySelector(".chat-suggestion").textContent); }); }); } function initializeLoginModal() { const sessionModal = document.getElementById('sessionModal'); const loginForm = document.getElementById('loginForm'); sessionModal.classList.remove('hidden'); loginForm.addEventListener('submit', async (event) => { event.preventDefault(); const fd = new FormData(loginForm); const email = fd.get('email').trim(); const pin = fd.get('pin').trim(); userTable = Number(fd.get('table').trim()); if (!email || !pin || !userTable) { showError("Por favor, completa todos los campos."); return; } try{ const {data} = await login(email, pin) userToken = data.token; userName = data.name; userId = data.id; if (!userToken || data.id === undefined) { showError("Error al iniciar sesión."); return; } sessionModal.classList.add('hidden'); initializeApp(); }catch (error) { } }); } function initializeChat() { if (!chatForm) return; chatForm.addEventListener("submit", (event) => { event.preventDefault(); if (chatInputElement.value.trim() === "") return; sendMessageToAI(); chatInputElement.addEventListener("input", () => { if (chatInputElement.value.trim() === "") { chatSuggestionsElement.classList.remove("hidden"); } else { chatSuggestionsElement.classList.add("hidden"); } }); }); } function setupBasicListeners() { if (!checkoutButton) return; checkoutButton.addEventListener("click", processOrder); } //#endregion //#region ===== Utilidad ===== function formatPrice(price) { return price.toLocaleString("es-CL", { style: "currency", currency: "CLP" }); } //#endregion //#region ===== Productos ===== async function renderProducts() { if (!productListElement) return; const template = document.getElementById("product-card-template"); if (!template) return; productListElement.innerHTML = ""; console.log("Cargando productos..."); products = await getProducts(userToken); 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); }); }); } //#endregion //#region ===== Carrito ===== async function addToCart (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.disabled = true; setTimeout(() => { buttonElement.innerHTML = originalHTML; buttonElement.disabled = false; }, 300); } updateCartDisplay(); // Dentro de addToCart (después de updateCartDisplay()) if (typeof showToast === "function") showToast(`${product.name} agregado al carrito`); }; async function 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 calculateTotal() { if (!cartTotalElement) return; const total = cart.reduce((sum, item) => sum + item.price * item.quantity, 0); cartTotalElement.textContent = formatPrice(total); } 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)}