/**
 * POS Logic - Sistema Sufarma
 * Renderizado seguro y cálculos precisos
 */

class POS {
    constructor() {
        this.currentPage = 1;
        this.searchQuery = '';
        this.searchTimeout = null;
        this.currentProducts = [];
        // Caché para stock de sucursales (lazy loading)
        this.branchStockCache = {};
        this.branchStockLoading = {};
        this.init();
    }

    init() {
        window.pos = this;
        this.syncOfflineCatalog();
        this.loadProducts();
        // Sales summary is handled by footer.php (single source of truth)

        const searchInput = document.getElementById('searchInput');
        if (searchInput) {
            searchInput.addEventListener('input', (e) => {
                if (this.searchTimeout) clearTimeout(this.searchTimeout);
                this.searchTimeout = setTimeout(() => {
                    this.searchQuery = e.target.value.trim();
                    this.currentPage = 1;
                    this.loadProducts();
                }, 400); // Optimizado: 400ms para reducir llamadas API
            });
        }
    }

    async syncOfflineCatalog() {
        if (navigator.onLine && window.OfflineDB) {
            try {
                console.log('Descargando catálogo offline...');
                const response = await fetch('api/productos/todos_sync.php');
                const data = await response.json();
                if (data.success) {
                    await window.OfflineDB.syncProductos(data.productos);
                }
            } catch (error) {
                console.warn('No se pudo sincronizar el catálogo de fondo:', error);
            }
        }

        const btnPay = document.getElementById('btnProceedPayment');
        if (btnPay) {
            btnPay.addEventListener('click', () => {
                this.proceedToPayment();
            });
        }
        
        // --- SSE: ESCUCHAR ACTUALIZACIONES EXTERNAS DE STOCK ---
        document.addEventListener('sync:stock_actualizado', (e) => {
            const pid = e.detail?.productoId;
            if (pid) {
                console.log(`⚡ Sincronizando stock en POS para producto ${pid}`);
                // Esta función ya estaba creada y optimizada:
                this.updateProductStock(pid);
            }
        });

        if (typeof searchInput !== 'undefined' && searchInput) searchInput.focus();
    }

    async loadProducts() {
        const productsGrid = document.getElementById('productsGrid');
        productsGrid.innerHTML = '<div class="loading" style="padding:2rem; text-align:center;"><div class="spinner"></div><p>Cargando...</p></div>';

        // Limpiar caché de stock de sucursales al cargar nuevos productos
        this.branchStockCache = {};
        this.branchStockLoading = {};

        try {
            if (!navigator.onLine && window.OfflineDB) {
                console.log('Mostrando resultados offline de Dexie.js (Sin conexión)');
                const offlineResult = await window.OfflineDB.buscarProductos(this.searchQuery);
                this.handleProductResponse(offlineResult, productsGrid);
                return;
            }

            const url = `api/productos/buscar.php?query=${encodeURIComponent(this.searchQuery)}&page=${this.currentPage}`;
            const response = await fetch(url);
            const data = await response.json();

            if (data.success) {
                this.handleProductResponse(data.productos, productsGrid);
            } else {
                this.handleProductResponse([], productsGrid);
            }
        } catch (error) {
            console.warn("Fetch falló, intentando base de datos offline", error);
            if (window.OfflineDB) {
                const offlineResult = await window.OfflineDB.buscarProductos(this.searchQuery);
                this.handleProductResponse(offlineResult, productsGrid);
            } else {
                productsGrid.innerHTML = '<p style="color:red; text-align:center;">Error de conexión. Sin conexión y DB offline no disponible.</p>';
            }
        }
    }

    handleProductResponse(productosArray, productsGrid) {
        if (productosArray && productosArray.length > 0) {
            this.currentProducts = productosArray;
            this.renderProducts(productosArray);
        } else {
            this.currentProducts = [];
            productsGrid.innerHTML = `
                <div class="empty-state" style="grid-column: 1 / -1; text-align: center; padding: 2rem;">
                    <div style="font-size: 3rem;">📦</div>
                    <p>No se encontraron productos</p>
                </div>`;
        }
    }

    formatStock(stock, producto) {
        if (!stock || stock <= 0) return 'Sin Stock';
        if (!producto) return `Stock: ${stock}`;

        const factorCaja = parseInt(producto.factor_caja) || 1;
        const factorBlister = parseInt(producto.factor_blister) || 1;

        const tieneCaja = parseFloat(producto.precios?.caja) > 0 && factorCaja > 1;
        const tieneBlister = parseFloat(producto.precios?.blister) > 0 && factorBlister > 1;
        const tieneUnidad = parseFloat(producto.precios?.unidad) > 0;

        let rem = stock;
        let parts = [];

        if (tieneCaja && rem >= factorCaja) {
            const cajas = Math.floor(rem / factorCaja);
            rem = rem % factorCaja;
            parts.push(`${cajas} ${cajas === 1 ? (producto.nombres?.caja || 'Caja') : (producto.nombres?.caja ? producto.nombres.caja + 's' : 'Cajas')}`);
        }

        if (tieneBlister && rem >= factorBlister) {
            const blisters = Math.floor(rem / factorBlister);
            rem = rem % factorBlister;
            parts.push(`${blisters} ${blisters === 1 ? (producto.nombres?.blister || 'Blíster') : (producto.nombres?.blister ? producto.nombres.blister + 's' : 'Blísters')}`);
        }

        if (rem > 0 || parts.length === 0) {
            parts.push(`${rem} ${rem === 1 ? (producto.nombres?.unidad || 'Unidad') : (producto.nombres?.unidad ? producto.nombres.unidad + 'es' : 'Unidades')}`);
        }

        return 'Stock: ' + parts.join(', ');
    }

    renderProducts(productos) {
        const productsGrid = document.getElementById('productsGrid');
        let html = '';

        productos.forEach(producto => {
            // Stock indicator
            let stockClass = producto.stock > 10 ? 'in-stock' : (producto.stock > 0 ? 'low-stock' : 'out-stock');
            let stockText = this.formatStock(producto.stock, producto);

            // Prices
            const p = producto.precios;
            const nombres = producto.nombres || { unidad: 'Unidad', blister: 'Blíster', caja: 'Caja' };

            html += `
                <div class="product-card" data-product-id="${producto.id}">
                    <!-- Product Image Section with Colored Background -->
                    <div class="product-image-section" onmouseenter="pos.loadBranchStockLazy(${producto.id})">
                        <!-- Stock Badge (Top Right) -->
                        <div class="stock-badge ${stockClass}">
                            <span>${stockText}</span>
                        </div>
                        
                        <img src="${producto.imagen || 'assets/images/placeholder.png'}" 
                             class="product-image"
                             onerror="this.src='assets/images/placeholder.png'">
                        
                        <!-- Branch Stock Overlay (shown on hover) -->
                        <div class="branch-stock-overlay" id="branchStock_${producto.id}">
                            <div class="branch-stock-item">
                                <div class="branch-name">Pasa el mouse para ver...</div>
                                <div class="branch-stock">Stock en otras sucursales</div>
                            </div>
                        </div>
                    </div>
                    
                    <!-- Product Info Section -->
                    <div class="product-info-section">
                        <!-- Brand Label -->
                        <div class="brand-label">${producto.laboratorio || 'Genérico'}</div>
                        
                        <!-- Product Name & Codes -->
                        <div class="product-name">${producto.nombre}</div>
                        <div class="product-codes">Cód. Interno: ${producto.codigo}</div>
                        ${producto.codigo_barra ? `<div class="product-codes">Cód. Barras: ${producto.codigo_barra}</div>` : ''}
                        
                        <!-- Price Grid - 3 Columns -->
                        <div class="price-grid">
                            ${p.unidad > 0 ? `
                            <div class="price-item price-unit" onclick="pos.addToCart(${producto.id}, ${p.unidad}, '${nombres.unidad.toUpperCase()}', ${producto.es_facturable?.unidad === 1})">
                                <div class="price-info-content">
                                    <div class="price-label">${nombres.unidad}</div>
                                    <div class="price-value">Q ${parseFloat(p.unidad).toFixed(2)}</div>
                                </div>
                                <div class="price-facturar-action" onclick="event.stopPropagation()">
                                    <label class="price-check-container">
                                        <input type="checkbox" onchange="if(this.checked) { pos.addToCart(${producto.id}, ${p.unidad}, '${nombres.unidad.toUpperCase()}', true); setTimeout(() => this.checked = false, 500); }">
                                        <span class="price-check-label">Facturar</span>
                                    </label>
                                </div>
                            </div>` : ''}
                            ${p.blister > 0 ? `
                            <div class="price-item" onclick="pos.addToCart(${producto.id}, ${p.blister}, '${nombres.blister.toUpperCase()}', ${producto.es_facturable?.blister === 1})">
                                <div class="price-info-content">
                                    <div class="price-label">${nombres.blister}</div>
                                    <div class="price-value">Q ${parseFloat(p.blister).toFixed(2)}</div>
                                </div>
                                <div class="price-facturar-action" onclick="event.stopPropagation()">
                                    <label class="price-check-container">
                                        <input type="checkbox" onchange="if(this.checked) { pos.addToCart(${producto.id}, ${p.blister}, '${nombres.blister.toUpperCase()}', true); setTimeout(() => this.checked = false, 500); }">
                                        <span class="price-check-label">Facturar</span>
                                    </label>
                                </div>
                            </div>` : ''}
                            ${p.caja > 0 ? `
                            <div class="price-item" onclick="pos.addToCart(${producto.id}, ${p.caja}, '${nombres.caja.toUpperCase()}', ${producto.es_facturable?.caja === 1})">
                                <div class="price-info-content">
                                    <div class="price-label">${nombres.caja}</div>
                                    <div class="price-value">Q ${parseFloat(p.caja).toFixed(2)}</div>
                                </div>
                                <div class="price-facturar-action" onclick="event.stopPropagation()">
                                    <label class="price-check-container">
                                        <input type="checkbox" onchange="if(this.checked) { pos.addToCart(${producto.id}, ${p.caja}, '${nombres.caja.toUpperCase()}', true); setTimeout(() => this.checked = false, 500); }">
                                        <span class="price-check-label">Facturar</span>
                                    </label>
                                </div>
                            </div>` : ''}
                        </div>
                    </div>
                </div>
            `;
        });
        productsGrid.innerHTML = html;
    }

    async addToCart(id, precio, presentacion, facturar = false) {
        const productoEncontrado = this.currentProducts.find(p => p.id == id);

        if (!productoEncontrado) {
            console.error("Producto no encontrado en memoria");
            return;
        }

        // Determinar el costo según la presentación
        let costo = 0;
        const costos = productoEncontrado.costos || {};
        const nombres = productoEncontrado.nombres || { unidad: 'UNIDAD', blister: 'BLISTER', caja: 'CAJA' };

        const nameUpper = presentacion.toUpperCase();
        if (nameUpper === nombres.unidad.toUpperCase()) {
            costo = costos.unidad || 0;
        } else if (nameUpper === nombres.blister.toUpperCase()) {
            costo = costos.blister || 0;
        } else if (nameUpper === nombres.caja.toUpperCase()) {
            costo = costos.caja || 0;
        } else if (nameUpper === 'MIXTO') {
            costo = costos.misto || 0;
        } else {
            // Fallbacks for legacy compatibility
            if (nameUpper === 'CAJA COMPLETA' || nameUpper === 'CAJA') {
                costo = costos.caja || 0;
            } else if (nameUpper === 'BLISTER') {
                costo = costos.blister || 0;
            } else if (nameUpper === 'UNIDAD') {
                costo = costos.unidad || 0;
            }
        }

        cart.addItem({
            id: productoEncontrado.id,
            nombre: productoEncontrado.nombre,
            laboratorio: productoEncontrado.laboratorio,
            codigo: productoEncontrado.codigo,
            exento_iva: productoEncontrado.exento_iva,
            receta_controlada: productoEncontrado.receta_controlada
        }, precio, presentacion, facturar, costo);

        this.showToast(`✅ Agregado: ${productoEncontrado.nombre}`);
    }

    showStockAlert(mensaje, nombreProducto) {
        // Crear modal de alerta
        const existingModal = document.getElementById('stockAlertModal');
        if (existingModal) existingModal.remove();

        const modal = document.createElement('div');
        modal.id = 'stockAlertModal';
        modal.innerHTML = `
            <div style="
                position: fixed; top: 0; left: 0; right: 0; bottom: 0;
                background: rgba(0,0,0,0.6); z-index: 10000;
                display: flex; align-items: center; justify-content: center;
                animation: fadeIn 0.2s ease;
            ">
                <div style="
                    background: var(--card-bg); border-radius: 16px; padding: 24px 32px;
                    max-width: 450px; width: 90%; box-shadow: 0 20px 60px rgba(0,0,0,0.3);
                    animation: slideIn 0.3s ease;
                ">
                    <div style="text-align: center; margin-bottom: 16px;">
                        <div style="font-size: 48px; margin-bottom: 8px;">⚠️</div>
                        <h3 style="color: #dc2626; margin: 0; font-size: 1.2rem;">Stock Insuficiente</h3>
                        <p style="color: #64748b; font-size: 0.85rem; margin-top: 4px;">${nombreProducto}</p>
                    </div>
                    <pre style="
                        background: var(--background); padding: 16px; border-radius: 10px;
                        font-family: 'Inter', sans-serif; font-size: 0.85rem;
                        color: #334155; white-space: pre-wrap; line-height: 1.6;
                        margin-bottom: 20px; border: 1px solid #e2e8f0;
                    ">${mensaje.replace(/⚠️ Stock insuficiente.*?\n\n/, '')}</pre>
                    <button onclick="document.getElementById('stockAlertModal').remove()" style="
                        width: 100%; padding: 12px; background: linear-gradient(135deg, #667eea, #764ba2);
                        color: white; border: none; border-radius: 10px; font-weight: 600;
                        cursor: pointer; font-size: 0.95rem;
                    ">Entendido</button>
                </div>
            </div>
            <style>
                @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
                @keyframes slideIn { from { transform: scale(0.9); opacity: 0; } to { transform: scale(1); opacity: 1; } }
            </style>
        `;
        document.body.appendChild(modal);
    }

    toggleFacturado(id, value) {
        const card = document.querySelector(`[data-product-id="${id}"]`);
        if (!card) return;

        const checkbox = card.querySelector('.toggle-input');
        if (checkbox) {
            checkbox.checked = value;
        }
    }

    /**
     * Carga LAZY de stock por sucursal (solo cuando el usuario hace hover)
     * OPTIMIZACIÓN: Con caché para evitar múltiples llamadas
     */
    async loadBranchStockLazy(productoId) {
        // Si ya está en caché, actualizar UI directamente
        if (this.branchStockCache[productoId]) {
            this.renderBranchStock(productoId, this.branchStockCache[productoId]);
            return;
        }

        // Si ya está cargando, no hacer otra llamada
        if (this.branchStockLoading[productoId]) {
            return;
        }

        this.branchStockLoading[productoId] = true;

        // Mostrar estado de carga
        const container = document.getElementById(`branchStock_${productoId}`);
        if (container) {
            container.innerHTML = '<div class="branch-stock-item"><div class="branch-name">Cargando...</div></div>';
        }

        await this.loadBranchStock(productoId);
        this.branchStockLoading[productoId] = false;
    }

    /**
     * Renderiza el stock de sucursales desde caché
     */
    renderBranchStock(productoId, sucursales) {
        const container = document.getElementById(`branchStock_${productoId}`);
        if (!container) return;

        if (sucursales.length === 0) {
            container.innerHTML = '<div class="branch-stock-title">Sin stock disponible</div>';
            return;
        }

        let html = '<div class="branch-stock-title">Otras Sucursales</div><div class="branch-stock-list">';
        sucursales.forEach(sucursal => {
            const stockTotal = sucursal.stock || 0;
            const stockF = sucursal.stock_facturado || 0;
            const stockNF = sucursal.stock_no_facturado || 0;
            const stockClass = stockTotal > 0 ? 'in-stock' : 'out-stock';

            // Lógica para que se vea más limpio
            let shortName = sucursal.nombre_corto || sucursal.nombre;
            if (!sucursal.nombre_corto) {
                const match = sucursal.nombre.match(/\(([^)]+)\)/);
                shortName = match ? match[1] : sucursal.nombre.replace('Farmacia San Fernando', '').trim();
            }

            html += `
                <div class="branch-stock-item">
                    <div class="branch-name">${shortName}</div>
                    <div class="branch-stock ${stockClass}">F:${stockF} NF:${stockNF}</div>
                </div>
            `;
        });
        html += '</div>';
        container.innerHTML = html;
    }

    async loadBranchStock(productoId) {
        try {
            const response = await fetch(`api/productos/stock_sucursales.php?producto_id=${productoId}`);
            const data = await response.json();

            // Guardar en caché
            this.branchStockCache[productoId] = data.success ? data.sucursales : [];

            if (data.success && data.sucursales.length > 0) {
                const container = document.getElementById(`branchStock_${productoId}`);
                if (!container) return;

                let html = '<div class="branch-stock-title">Otras Sucursales</div><div class="branch-stock-list">';
                data.sucursales.forEach(sucursal => {
                    const stockTotal = sucursal.stock || 0;
                    const stockF = sucursal.stock_facturado || 0;
                    const stockNF = sucursal.stock_no_facturado || 0;
                    const stockClass = stockTotal > 0 ? 'in-stock' : 'out-stock';

                    // Usar nombre corto si existe, sino extraer del nombre completo
                    let shortName = sucursal.nombre_corto || sucursal.nombre;
                    if (!sucursal.nombre_corto) {
                        const match = sucursal.nombre.match(/\(([^)]+)\)/);
                        shortName = match ? match[1] : sucursal.nombre.replace('Farmacia San Fernando', '').trim();
                    }

                    // Mostrar formato más limpio y alineado
                    html += `
                        <div class="branch-stock-item">
                            <div class="branch-name">${shortName}</div>
                            <div class="branch-stock ${stockClass}">F:${stockF} NF:${stockNF}</div>
                        </div>
                    `;
                });
                html += '</div>';

                container.innerHTML = html;
            } else {
                // Si no hay sucursales con stock, mostrar mensaje
                const container = document.getElementById(`branchStock_${productoId}`);
                if (container) {
                    container.innerHTML = '<div class="branch-stock-title">Sin stock en otras sucursales</div>';
                }
            }
        } catch (error) {
            console.error('Error loading branch stock:', error);
            // Keep loading state on error
        }
    }

    /**
     * Actualizar el stock de un producto específico sin recargar todos los productos
     */
    async updateProductStock(productId) {
        try {
            const response = await fetch(`api/productos/verificar_stock.php?producto_id=${productId}`);
            const data = await response.json();

            if (data && data.success) {
                const stock = data.stock;
                const card = document.querySelector(`[data-product-id="${productId}"]`);
                if (card) {
                    const productInfo = this.currentProducts.find(p => p.id == productId);
                    const stockBadge = card.querySelector('.stock-badge');
                    if (stockBadge) {
                        let stockClass = stock > 10 ? 'in-stock' : (stock > 0 ? 'low-stock' : 'out-stock');
                        let stockText = stock > 0 ? this.formatStock(stock, productInfo) : 'Sin Stock';
                        stockBadge.className = `stock-badge ${stockClass}`;
                        const span = stockBadge.querySelector('span');
                        if (span) span.textContent = stockText;
                    }
                }
                delete this.branchStockCache[productId];
            }
        } catch (error) {
            console.warn(`Error en sync stock (ID ${productId}):`, error);
        }
    }
    
    // Generar un UUID v4 para identificación única de transacciones (Idempotencia)
    generateUUID() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    }

    async proceedToPayment() {
        // Fase 2.2: Verificar si hay sesión de caja activa
        if (!window.cajaManager || !window.cajaManager.activeSession) {
            this.showToast("❌ No hay sesión de caja abierta. Debe abrir turno para poder vender.", "error");
            if (window.cajaManager) {
                window.cajaManager.checkSessionState();
            }
            return;
        }
        const caja_sesion_id = window.cajaManager.activeSession.id;

        const totals = await cart.calculateTotals();

        if (cart.items.length === 0) {
            this.showToast("El carrito está vacío", 'error');
            return;
        }

        // Fase 2.5: Check for controlled medications
        const controlledItems = cart.items.filter(item => item.receta_controlada == 1);
        if (controlledItems.length > 0) {
            const recetaResult = await this.showRecetaModal(controlledItems);
            if (recetaResult === null) {
                // User cancelled
                return;
            }
            // Store receta data for later saving
            this._pendingRecetaData = recetaResult;
        }

        // Mostrar modal de selección de usuario
        let usuarioId;
        try {
            usuarioId = await userSelection.selectUser();
        } catch (error) {
            // Usuario canceló la selección
            console.log('Selección de usuario cancelada');
            return;
        }

        const btn = document.getElementById('btnProceedPayment');
        const originalText = btn.textContent;
        btn.disabled = true;
        btn.textContent = 'Procesando...';

        try {
            let response, result;

            // PRE-PROCESAR ITEMS CON DESCUENTO
            // Como calculateTotals no sobrescribe los precios originales en el array,
            // necesitamos aplicar el precio con descuento para guardar en la BD.
            // Copia profunda e ID Único
            let itemsParaGuardar = JSON.parse(JSON.stringify(cart.items)); 
            const saleUUID = this.generateUUID();

            const tipoDescuento = typeof obtenerTipoDescuentoActual === 'function' ? obtenerTipoDescuentoActual() : 'ninguno';
            const codigoEmpleado = typeof obtenerCodigoEmpleadoValidado === 'function' ? obtenerCodigoEmpleadoValidado() : null;
            let totalPreliminar = cart.items.reduce((acc, obj) => acc + (obj.precio * obj.cantidad), 0);

            for (let i = 0; i < itemsParaGuardar.length; i++) {
                let item = itemsParaGuardar[i];
                if (tipoDescuento !== 'ninguno' && typeof calcularPrecioConDescuento === 'function') {
                    const resultado = await calcularPrecioConDescuento(
                        item.precio,
                        tipoDescuento,
                        codigoEmpleado,
                        item.costo || 0,
                        totalPreliminar
                    );

                    if (resultado && resultado.success && resultado.descuento_aplicable) {
                        item.precio = resultado.precio_final; // El servidor guardará este
                    }
                }
            }

            let isOfflineFallback = !navigator.onLine;
            
            // Si está ONLINE intentamos guardar en el servidor
            if (!isOfflineFallback) {
                // Verificar si estamos editando una venta existente
                if (cart.editingVentaId) {
                    // Actualizar venta existente
                    response = await fetch('api/ventas/actualizar.php', {
                        method: 'POST',
                        headers: { 'Content-Type': 'application/json' },
                        body: JSON.stringify({
                            venta_id: cart.editingVentaId,
                            items: itemsParaGuardar,
                            total: totals.total,
                            subtotal: totals.subtotal,
                            taxes: totals.taxes,
                            descuento: totals.descuento || 0,
                            usuario_id: usuarioId
                        })
                    });
                } else {
                    // Crear nueva venta
                    response = await fetch('api/ventas/crear.php', {
                        method: 'POST',
                        headers: { 'Content-Type': 'application/json' },
                        body: JSON.stringify({
                            client_uuid: saleUUID,
                            items: itemsParaGuardar,
                            total: totals.total,
                            subtotal: totals.subtotal,
                            taxes: totals.taxes,
                            descuento: totals.descuento || 0,
                            usuario_id: usuarioId,
                            caja_sesion_id: caja_sesion_id
                        })
                    });
                }

                const textResponse = await response.text();
                try {
                    result = JSON.parse(textResponse);
                } catch (e) {
                    console.error("Respuesta inválida:", textResponse);
                    // Forzar el fallback a Offline
                    isOfflineFallback = true;
                }
            }

            // Fallback a Offline si no hay internet o falló el fetch silenciosamente
            if (isOfflineFallback || (result && !result.success)) {
                if(window.OfflineDB && !cart.editingVentaId) {
                    console.log('Guardando venta de forma local...');
                    const saved = await window.OfflineDB.guardarVentaPendiente({
                        client_uuid: saleUUID,
                        items: itemsParaGuardar,
                        total: totals.total,
                        subtotal: totals.subtotal,
                        taxes: totals.taxes,
                        descuento: totals.descuento || 0,
                        usuario_id: usuarioId,
                        caja_sesion_id: caja_sesion_id
                    });
                    
                    if (saved) {
                        result = { success: true, offline: true };
                        // Intentar forzar la subida global en el background sync
                        if(typeof window.triggerBackgroundSync === 'function') {
                            window.triggerBackgroundSync();
                        }
                    } else {
                        throw new Error("No se pudo guardar la venta en OfflineDB");
                    }
                } else if(cart.editingVentaId && isOfflineFallback) {
                   throw new Error("No puedes editar una venta antigua sin conexión a internet.");
                } else {
                   throw new Error(result ? result.error : "Error técnico en el servidor y falló DB offline.");
                }
            }

            if (result && result.success) {
                const isEdit = cart.editingVentaId !== null;

                // Limpiar modo edición
                cart.editingVentaId = null;
                cart.clear();

                // Resetear descuento después de la venta exitosa
                if (typeof resetearDescuento === 'function') {
                    resetearDescuento();
                }

                // IMPORTANTE: Recargar productos para actualizar stock en tiempo real
                await this.loadProducts();

                // También refrescar ventas recientes
                if (typeof recentSales !== 'undefined') {
                    recentSales.loadRecentSales();
                }

                // Actualizar resumen de ventas del día (función global de footer.php)
                if (typeof loadSalesSummary === 'function') loadSalesSummary();

                // Fase 2.5: Guardar datos de receta controlada si hay pendientes
                if (this._pendingRecetaData) {
                    try {
                        await fetch('api/ventas/guardar_receta.php', {
                            method: 'POST',
                            headers: { 'Content-Type': 'application/json' },
                            body: JSON.stringify({
                                venta_id: result.venta_id || null,
                                usuario_id: usuarioId,
                                ...this._pendingRecetaData
                            })
                        });
                    } catch(e) { console.warn('Error guardando receta:', e); }
                    this._pendingRecetaData = null;
                }

                if (result.offline) {
                    this.showToast(`✅ Venta Q${totals.total.toFixed(2)} guardada OFFLINE`, 'success');
                } else if (isEdit) {
                    this.showToast(`✅ Venta actualizada correctamente`, 'success');
                } else {
                    if (totals.itemsFacturar.length > 0) {
                        this.showToast(`✅ Venta Q${totals.total.toFixed(2)} registrada (Con productos para facturar)`, 'success');
                    } else {
                        this.showToast(`✅ Venta Q${totals.total.toFixed(2)} registrada`, 'success');
                    }
                }

                const searchInput = document.getElementById('searchInput');
                if (searchInput) searchInput.focus();

            } else if (!isOfflineFallback) {
                this.showToast('❌ Error: ' + (result.error || 'Error desconocido'), 'error');
            }
        } catch (error) {
            this.showToast(error.message, 'error');
        } finally {
            btn.disabled = false;
            btn.textContent = originalText;
        }
    }

    showToast(msg, type = 'info') {
        const toast = document.createElement('div');

        let icon = type === 'error' ? '❌' : (type === 'success' ? '✅' : 'ℹ️');
        // Clean up the message if it already has the icon to avoid duplication
        let cleanMsg = msg.replace(/^[❌✅ℹ️]\s*/, '');

        toast.innerHTML = `<span style="font-size: 1.1rem; margin-right: 8px;">${icon}</span> <span>${cleanMsg}</span>`;

        Object.assign(toast.style, {
            position: 'fixed',
            bottom: '30px',
            left: '50%',
            transform: 'translateX(-50%) translateY(20px)',
            background: type === 'error' ? '#ef4444' : (type === 'success' ? '#10b981' : '#3b82f6'),
            color: 'white',
            padding: '12px 24px',
            borderRadius: '100px',
            boxShadow: '0 10px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)',
            zIndex: '10000',
            fontSize: '14px',
            fontWeight: '600',
            opacity: '0',
            transition: 'all 0.4s cubic-bezier(0.16, 1, 0.3, 1)',
            fontFamily: 'Inter, sans-serif',
            display: 'flex',
            alignItems: 'center'
        });

        document.body.appendChild(toast);

        requestAnimationFrame(() => {
            toast.style.opacity = '1';
            toast.style.transform = 'translateX(-50%) translateY(0)';
        });

        setTimeout(() => {
            toast.style.opacity = '0';
            toast.style.transform = 'translateX(-50%) translateY(20px)';
            setTimeout(() => {
                if (toast.parentNode) toast.parentNode.removeChild(toast);
            }, 400);
        }, 3000);
    }

    // Sales summary is managed by footer.php (single source of truth)
    // Removed duplicate loadSalesSummary, updateSalesSummaryDisplay, startSalesSummaryRefresh

    /**
     * Fase 2.5: Muestra el modal de receta controlada
     * @param {Array} controlledItems - Items del carrito que requieren receta
     * @returns {Promise<Object|null>} - null si cancela, objeto con datos de receta si continúa
     */
    showRecetaModal(controlledItems) {
        return new Promise((resolve) => {
            const modal = document.getElementById('modalRecetaControlada');
            if (!modal) {
                console.warn('Modal de receta controlada no encontrado');
                resolve({ productos: controlledItems.map(i => i.producto_id), fue_omitida: 1, nombre_medico: null, colegiado: null, nombre_paciente: null, dpi_paciente: null });
                return;
            }

            // Populate controlled items list
            const listContainer = document.getElementById('recetaControlledList');
            if (listContainer) {
                let listHtml = '';
                controlledItems.forEach(item => {
                    listHtml += `<div style="display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px solid #fecaca;">
                        <span style="font-size: 1.1rem;">💊</span>
                        <div>
                            <div style="font-weight: 600; font-size: 0.85rem; color: #991b1b;">${item.nombre}</div>
                            <div style="font-size: 0.75rem; color: #b91c1c;">${item.presentacion} × ${item.cantidad}</div>
                        </div>
                    </div>`;
                });
                listContainer.innerHTML = listHtml;
            }

            // Clear form
            const fields = ['recetaNombreMedico', 'recetaColegiado', 'recetaNombrePaciente', 'recetaDpiPaciente'];
            fields.forEach(id => {
                const el = document.getElementById(id);
                if (el) el.value = '';
            });
            const errorDiv = document.getElementById('recetaFormError');
            if (errorDiv) errorDiv.style.display = 'none';

            // Show modal
            modal.style.display = 'flex';

            const productIds = controlledItems.map(i => i.producto_id);

            // Cleanup function
            const cleanup = () => {
                modal.style.display = 'none';
                btnCancelar.removeEventListener('click', onCancelar);
                btnOmitir.removeEventListener('click', onOmitir);
                btnRegistrar.removeEventListener('click', onRegistrar);
            };

            const btnCancelar = document.getElementById('btnRecetaCancelar');
            const btnOmitir = document.getElementById('btnRecetaOmitir');
            const btnRegistrar = document.getElementById('btnRecetaRegistrar');

            const onCancelar = () => {
                cleanup();
                resolve(null);
            };

            const onOmitir = () => {
                cleanup();
                resolve({
                    productos: productIds,
                    fue_omitida: 1,
                    nombre_medico: null,
                    colegiado: null,
                    nombre_paciente: null,
                    dpi_paciente: null
                });
            };

            const onRegistrar = () => {
                const nombre_medico = (document.getElementById('recetaNombreMedico')?.value || '').trim();
                const colegiado = (document.getElementById('recetaColegiado')?.value || '').trim();
                const nombre_paciente = (document.getElementById('recetaNombrePaciente')?.value || '').trim();
                const dpi_paciente = (document.getElementById('recetaDpiPaciente')?.value || '').trim();

                // Validate all fields
                if (!nombre_medico || !colegiado || !nombre_paciente || !dpi_paciente) {
                    const errorDiv = document.getElementById('recetaFormError');
                    if (errorDiv) errorDiv.style.display = 'block';
                    return;
                }

                cleanup();
                resolve({
                    productos: productIds,
                    fue_omitida: 0,
                    nombre_medico,
                    colegiado,
                    nombre_paciente,
                    dpi_paciente
                });
            };

            btnCancelar.addEventListener('click', onCancelar);
            btnOmitir.addEventListener('click', onOmitir);
            btnRegistrar.addEventListener('click', onRegistrar);
        });
    }
}

const pos = new POS();