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

class Cart {
    constructor() {
        this.items = [];
        this.editingVentaId = null; // ID de venta en edición
        this.init();
    }

    init() {
        try {
            const savedCart = localStorage.getItem('sufarma_cart');
            if (savedCart) {
                this.items = JSON.parse(savedCart);
            }
        } catch (e) {
            console.error("Error cargando carrito local", e);
            this.items = [];
        }

        // Verificar si hay una venta para editar
        const editData = sessionStorage.getItem('sufarma_edit_sale');
        if (editData) {
            try {
                const data = JSON.parse(editData);
                this.editingVentaId = data.venta_id;
                this.loadSaleForEdit(data);
                sessionStorage.removeItem('sufarma_edit_sale');

                // Mostrar notificación
                setTimeout(() => {
                    this.showToast('✏️ Venta cargada para edición');
                }, 500);
            } catch (e) {
                console.error("Error cargando venta para editar", e);
            }
        }

        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', () => this.render());
        } else {
            this.render();
        }
    }

    /**
     * Cargar venta para editar
     */
    loadSaleForEdit(saleData) {
        // Limpiar carrito actual
        this.items = [];

        // Cargar items de la venta
        if (saleData.items && saleData.items.length > 0) {
            saleData.items.forEach(item => {
                this.items.push({
                    producto_id: item.producto_id,
                    nombre: item.nombre,
                    laboratorio: item.laboratorio || '',
                    presentacion: item.presentacion || 'UNIDAD',
                    precio: parseFloat(item.precio),
                    costo: parseFloat(item.costo) || 0,
                    cantidad: parseInt(item.cantidad),
                    facturar: item.facturar || false,
                    exento_iva: item.exento_iva || 0
                });
            });
        }

        this.save();
        this.render();
    }

    /**
     * Agregar item al carrito
     */
    async addItem(productData, price, presentacion, facturar, costo = 0) {
        // Asegurar que el precio sea número
        const precioNum = parseFloat(price);
        const costoNum = parseFloat(costo);

        // Verificar si ya existe este producto exacto
        const index = this.items.findIndex(item =>
            item.producto_id === productData.id &&
            item.presentacion === presentacion
        );

        if (index !== -1) {
            this.items[index].cantidad++;
            // Actualizamos el costo si se proporcionó uno nuevo
            if (costoNum > 0) {
                this.items[index].costo = costoNum;
            }
            // Actualizamos si cambió la preferencia de facturar
            if (facturar) this.items[index].facturar = true;
        } else {
            this.items.push({
                producto_id: productData.id,
                nombre: productData.nombre,
                laboratorio: productData.laboratorio,
                presentacion: presentacion,
                precio: precioNum,
                costo: costoNum,
                cantidad: 1,
                facturar: facturar || false,
                exento_iva: productData.exento_iva, // <--- Guardamos el estado exento
                receta_controlada: productData.receta_controlada || 0,
                requiere_receta: productData.requiere_receta || 0,
                nombre_generico: productData.nombre_generico || ''
            });
        }

        this.save();

        // Verificar contraindicaciones médicas
        await this.checkContraindications();

        await this.render(); // Hacer render async para recalcular descuentos
        // Toast se maneja en pos.js para evitar doble mensaje
    }

    async removeItem(index) {
        this.items.splice(index, 1);
        this.save();
        await this.render();
    }

    /**
     * Verificar contraindicaciones médicas en el carrito
     * Usa nombres genéricos para detectar interacciones entre medicamentos
     */
    async checkContraindications() {
        if (this.items.length < 2) {
            return; // No hay suficientes productos para verificar
        }

        try {
            // Obtener nombres genéricos únicos del carrito
            const genericos = [...new Set(
                this.items
                    .map(item => (item.nombre_generico || '').trim().toLowerCase())
                    .filter(g => g.length > 0)
            )];

            if (genericos.length < 2) {
                return; // No hay suficientes genéricos distintos
            }

            // Llamar a la API de contraindicaciones con genéricos
            const response = await fetch('api/pos/verificar_contraindicaciones.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    genericos: genericos
                })
            });

            const result = await response.json();

            if (result.success && result.alertas && result.alertas.length > 0) {
                // Mostrar modal de alerta
                this.showContraindicationsModal(result.alertas);
            }
        } catch (error) {
            console.error('Error verificando contraindicaciones:', error);
            // No mostrar error al usuario, continuar normalmente
        }
    }

    /**
     * Mostrar modal de contraindicaciones médicas
     * Usa el modal #modalContraindicaciones de modals_pos.php
     */
    showContraindicationsModal(alertas) {
        const modal = document.getElementById('modalContraindicaciones');
        if (!modal) {
            console.warn('Modal de contraindicaciones no encontrado');
            return;
        }

        // Determinar gravedad máxima
        const hasAlta = alertas.some(a => a.gravedad === 'alta');

        // Configurar header según gravedad
        const header = document.getElementById('contraHeader');
        const titulo = document.getElementById('contraTitulo');
        const subtitulo = document.getElementById('contraSubtitulo');

        if (header && titulo && subtitulo) {
            if (hasAlta) {
                header.style.background = 'linear-gradient(135deg, #dc2626, #b91c1c)';
                titulo.textContent = '⚠️ Alerta de Contraindicación Alta';
                subtitulo.textContent = 'Riesgo grave de interacción farmacológica';
            } else {
                header.style.background = 'linear-gradient(135deg, #f59e0b, #d97706)';
                titulo.textContent = '⚠️ Alerta de Contraindicación Moderada';
                subtitulo.textContent = 'Posible interacción farmacológica';
            }
        }

        // Configurar información de genéricos
        const productosDiv = document.getElementById('contraProductos');
        if (productosDiv) {
            let html = '';
            alertas.forEach(alerta => {
                const borderColor = alerta.gravedad === 'alta' ? '#fecaca' : '#fde68a';
                const bgColor = alerta.gravedad === 'alta' ? '#fef2f2' : '#fffbeb';
                html += `
                    <div style="background: ${bgColor}; border: 1px solid ${borderColor}; border-radius: 10px; padding: 12px; margin-bottom: 8px;">
                        <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
                            <strong style="font-size: 0.9rem;">${alerta.generico_1} ↔ ${alerta.generico_2}</strong>
                            <span style="
                                background: ${alerta.gravedad === 'alta' ? '#dc2626' : '#d97706'}; 
                                color: white; padding: 2px 8px; border-radius: 4px; 
                                font-size: 0.7rem; font-weight: 700; text-transform: uppercase;
                            ">${alerta.gravedad}</span>
                        </div>
                        <p style="margin: 0; font-size: 0.8rem; color: #6b7280; line-height: 1.4;">${alerta.descripcion}</p>
                    </div>
                `;
            });
            productosDiv.innerHTML = html;
        }

        // Configurar descripción general
        const descDiv = document.getElementById('contraDescripcion');
        if (descDiv) {
            descDiv.textContent = `Se encontraron ${alertas.length} interacción(es) entre medicamentos en el carrito. Revise antes de proceder.`;
        }

        // Configurar botones
        const continuarBtn = document.getElementById('btnContraContinuar');
        const eliminarBtn = document.getElementById('btnContraEliminar');

        if (continuarBtn) {
            continuarBtn.onclick = () => {
                this.closeContraindicationsModal();
            };
        }

        if (eliminarBtn) {
            eliminarBtn.onclick = () => {
                // Eliminar el producto más reciente
                const lastItemIndex = this.items.length - 1;
                if (lastItemIndex >= 0) {
                    this.items.splice(lastItemIndex, 1);
                    this.save();
                    this.render();
                }
                this.closeContraindicationsModal();
            };
        }

        // Mostrar modal
        modal.style.display = 'flex';
    }

    /**
     * Cerrar modal de contraindicaciones
     */
    closeContraindicationsModal() {
        const modal = document.getElementById('modalContraindicaciones');
        if (modal) modal.style.display = 'none';
    }

    async updateQuantity(index, newQty) {
        const qty = parseInt(newQty);
        if (qty <= 0) {
            await this.removeItem(index);
        } else {
            this.items[index].cantidad = qty;
            this.save();
            await this.render();
        }
    }

    async toggleFacturar(index) {
        this.items[index].facturar = !this.items[index].facturar;
        this.save();
        await this.render();
    }

    async calculateTotals() {
        let subtotal = 0;
        let subtotalFacturable = 0;
        let totalImpuestos = 0;
        let grandTotal = 0;
        let totalDescuento = 0;

        // Obtener tipo de descuento actual
        const tipoDescuento = obtenerTipoDescuentoActual ? obtenerTipoDescuentoActual() : 'ninguno';
        const codigoEmpleado = obtenerCodigoEmpleadoValidado ? obtenerCodigoEmpleadoValidado() : null;

        // Cargar configuración de descuentos si no está cargada
        if (!DescuentosConfig.descuentosActuales && typeof cargarConfigDescuentos === 'function') {
            await cargarConfigDescuentos();
        }

        // Calcular total preliminar para ayuda social
        let totalPreliminar = 0;
        for (const item of this.items) {
            totalPreliminar += item.precio * item.cantidad;
        }

        for (const item of this.items) {
            const lineaTotal = item.precio * item.cantidad;
            let precioConDescuento = item.precio;
            let descuentoLinea = 0;

            // Aplicar descuento si corresponde
            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) {
                    precioConDescuento = resultado.precio_final;
                    descuentoLinea = resultado.monto_descuento * item.cantidad;
                    totalDescuento += descuentoLinea;
                }
            }

            const lineaTotalConDescuento = precioConDescuento * item.cantidad;
            grandTotal += lineaTotalConDescuento;

            if (item.facturar) subtotalFacturable += lineaTotalConDescuento;

            // --- LÓGICA DE IMPUESTOS ---
            if (item.exento_iva == 1) {
                // Si es exento, el total de la línea va directo al subtotal neto
                subtotal += lineaTotalConDescuento;
                // Impuestos es 0 para este item
            } else {
                // Si NO es exento, desglosamos el IVA (12%)
                // Precio Base = Precio Total / 1.12
                const base = lineaTotalConDescuento / 1.12;
                const iva = lineaTotalConDescuento - base;

                subtotal += base;
                totalImpuestos += iva;
            }
        }

        return {
            subtotal: subtotal,
            taxes: totalImpuestos,
            total: grandTotal,
            descuento: totalDescuento,
            itemsFacturar: this.items.filter(i => i.facturar)
        };
    }

    save() {
        localStorage.setItem('sufarma_cart', JSON.stringify(this.items));
    }

    clear() {
        this.items = [];
        this.save();
        this.render();
    }

    async render() {
        const container = document.getElementById('cartItems');
        // Elementos de totales
        const elSubtotal = document.getElementById('subtotal');
        const elImpuestos = document.getElementById('taxes');
        const elTotal = document.getElementById('grandTotal');
        const elDescuento = document.getElementById('descuento-total');
        const elDescuentoRow = document.getElementById('descuento-row');
        const btnPay = document.getElementById('btnProceedPayment');

        if (!container) return; // Protección si no estamos en la página correcta

        // Actualizar Totales (ahora async) ANTES de renderizar, para saber precios finales
        const totals = await this.calculateTotals();

        if (this.items.length === 0) {
            container.innerHTML = `
                <div style="text-align:center; padding:2rem; color:#94a3b8;">
                    <div style="font-size:2rem; margin-bottom:0.5rem;">🛒</div>
                    <p>Carrito vacío</p>
                </div>`;
            if (btnPay) btnPay.disabled = true;
        } else {
            let html = '';

            // Re-evaluar precios con descuento si existen
            const tipoDescuento = typeof obtenerTipoDescuentoActual === 'function' ? obtenerTipoDescuentoActual() : 'ninguno';
            const codigoEmpleado = typeof obtenerCodigoEmpleadoValidado === 'function' ? obtenerCodigoEmpleadoValidado() : null;

            let totalPreliminar = this.items.reduce((acc, obj) => acc + (obj.precio * obj.cantidad), 0);

            for (let index = 0; index < this.items.length; index++) {
                const item = this.items[index];

                let precioActual = item.precio;
                let descuentoAplicado = false;

                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) {
                        precioActual = resultado.precio_final;
                        descuentoAplicado = true;
                    }
                }

                const totalLinea = (precioActual * item.cantidad).toFixed(2);
                const exentoInfo = item.exento_iva == 1 ? '<span style="color:#e67e22; font-weight:bold; font-size:0.8em;">(E)</span>' : '';

                // Mostrar texto tachado si hay descuento
                const precioUnidadHtml = descuentoAplicado ?
                    `<del style="color:#ef4444; font-size: 0.7rem; margin-right: 5px;">Q${item.precio.toFixed(2)}</del><span style="color:#10b981; font-weight:bold;">Q${precioActual.toFixed(2)}</span>` :
                    `<span>Q${precioActual.toFixed(2)}</span>`;

                html += `
                    <div class="cart-item" style="background:var(--surface-elevated); padding:10px; margin-bottom:8px; border-radius:12px; border:1px solid var(--border-color); box-shadow:var(--shadow-sm);">
                        <div style="display:flex; justify-content:space-between; margin-bottom:4px;">
                            <strong style="font-size:0.95rem; color:var(--neon-cyan); letter-spacing:0.5px;">${item.nombre} ${exentoInfo}</strong>
                            <button onclick="cart.removeItem(${index})" style="border:none; background:none; color:var(--neon-red); font-weight:bold; cursor:pointer; padding:0 5px; text-shadow:var(--shadow-glow-red);">✕</button>
                        </div>
                        <div style="font-size:0.75rem; color:var(--text-secondary); margin-bottom:8px;">
                            ${item.laboratorio} • ${item.presentacion}
                        </div>
                        <div style="font-size:0.75rem; color:var(--text-secondary); margin-bottom:8px;">
                            Unit: ${precioUnidadHtml}
                        </div>
                        <div style="display:flex; justify-content:space-between; align-items:center;">
                            <div style="display:flex; align-items:center; gap:5px;">
                                <button onclick="cart.updateQuantity(${index}, ${item.cantidad - 1})" style="width:24px; height:24px; border:1px solid var(--border-color); background:var(--card-bg); color:var(--text-primary); border-radius:4px; cursor:pointer;">-</button>
                                <input type="text" value="${item.cantidad}" style="width:30px; text-align:center; border:none; background:transparent; color:var(--text-primary); font-weight:600;" readonly>
                                <button onclick="cart.updateQuantity(${index}, ${item.cantidad + 1})" style="width:24px; height:24px; border:1px solid var(--border-color); background:var(--card-bg); color:var(--text-primary); border-radius:4px; cursor:pointer;">+</button>
                            </div>
                            <span style="color:var(--success-color); font-weight:700; text-shadow:0 0 10px rgba(34, 197, 94, 0.3); font-size: 0.95rem;">
                                <span style="font-size: 0.75rem; opacity: 0.8; margin-right: 4px; color: var(--text-secondary);">Subt:</span>Q${totalLinea}
                            </span>
                        </div>
                        <div style="margin-top:6px; margin-bottom: 2px; font-size:0.8rem;">
                            <label style="display:flex; align-items:center; gap:4px; cursor:pointer;">
                                <input type="checkbox" ${item.facturar ? 'checked' : ''} onchange="cart.toggleFacturar(${index})">
                                <span style="color:var(--text-primary);">Facturar</span>
                            </label>
                        </div>
                    </div>
                `;
            }
            container.innerHTML = html;
            if (btnPay) btnPay.disabled = false;
        }

        // Actualizar Totales (ahora async)
        if (elSubtotal) elSubtotal.textContent = `Q ${totals.subtotal.toFixed(2)}`;
        if (elImpuestos) elImpuestos.textContent = `Q ${totals.taxes.toFixed(2)}`;
        if (elTotal) elTotal.textContent = `Q ${totals.total.toFixed(2)}`;

        // Mostrar/ocultar fila de descuento
        if (elDescuento && elDescuentoRow) {
            if (totals.descuento > 0) {
                elDescuento.textContent = `-Q ${totals.descuento.toFixed(2)}`;
                elDescuentoRow.style.display = 'flex';
            } else {
                elDescuentoRow.style.display = 'none';
            }
        }

        const btnHold = document.getElementById('btnHoldSale');
        if (btnHold) {
            btnHold.disabled = (this.items.length === 0);
            btnHold.style.opacity = (this.items.length === 0) ? '0.5' : '1';
        }
    }

    showToast(message) {
        // Redirigir a la función premium de pos.js para consistencia si existe
        if (window.pos && typeof window.pos.showToast === 'function') {
            window.pos.showToast(message, 'success');
            return;
        }

        // Notificación flotante de respaldo premium
        const toast = document.createElement('div');
        let cleanMsg = message.replace(/^[❌✅ℹ️]\s*/, '');
        toast.innerHTML = `<span style="font-size: 1.1rem; margin-right: 8px;">✅</span> <span>${cleanMsg}</span>`;
        toast.style.cssText = `
            position: fixed; bottom: 30px; left: 50%; transform: translateX(-50%) translateY(20px);
            background: #10b981;
            color: white; padding: 12px 24px; border-radius: 100px;
            box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1); z-index: 10000;
            font-size: 14px; font-weight: 600; font-family: 'Inter', sans-serif;
            display: flex; align-items: center; opacity: 0; transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
        `;
        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(() => toast.remove(), 400);
        }, 2000);
    }
}

// Inicializar
const cart = new Cart();

// ============================================
// HOLD / RESUME SALES ACTIONS & EVENT LISTENERS
// ============================================

document.addEventListener('DOMContentLoaded', () => {
    const btnHold = document.getElementById('btnHoldSale');
    const btnResume = document.getElementById('btnResumeSales');
    const btnCloseEspera = document.getElementById('btnCloseVentasEspera');
    const modalEspera = document.getElementById('modalVentasEspera');

    if (btnHold) {
        btnHold.addEventListener('click', async () => {
            if (cart.items.length === 0) return;

            const clientName = prompt("Ingrese el nombre del cliente (opcional):", "Cliente General");
            if (clientName === null) return; // Cancelado

            const totals = await cart.calculateTotals();

            try {
                const response = await fetch('api/ventas/guardar_espera.php', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({
                        items: cart.items,
                        cliente_nombre: clientName,
                        total: totals.total
                    })
                });

                const data = await response.json();

                if (data.success) {
                    cart.showToast("⏸️ Venta en espera: " + data.codigo_espera);
                    cart.clear();
                } else {
                    alert("Error al poner en espera: " + (data.error || "Desconocido"));
                }
            } catch (err) {
                console.error(err);
                alert("Error de conexión al poner venta en espera");
            }
        });
    }

    if (btnResume) {
        btnResume.addEventListener('click', () => {
            if (modalEspera) {
                modalEspera.style.display = 'flex';
                cargarVentasEsperaList();
            }
        });
    }

    if (btnCloseEspera) {
        btnCloseEspera.addEventListener('click', () => {
            if (modalEspera) modalEspera.style.display = 'none';
        });
    }

    // Cerrar haciendo clic fuera
    window.addEventListener('click', (e) => {
        if (e.target === modalEspera) {
            modalEspera.style.display = 'none';
        }
    });
});

async function cargarVentasEsperaList() {
    const container = document.getElementById('listaVentasEspera');
    if (!container) return;

    container.innerHTML = `
        <div style="text-align: center; padding: 2rem; color: #64748b;">
            <div class="spinner" style="margin: 0 auto 10px auto; border-top-color: #3b82f6;"></div>
            Cargando ventas...
        </div>
    `;

    try {
        const response = await fetch('api/ventas/listar_espera.php');
        const data = await response.json();

        if (data.success && data.data && data.data.length > 0) {
            let html = '';
            data.data.forEach(venta => {
                const fecha = new Date(venta.created_at).toLocaleString();
                html += `
                    <div style="display: flex; justify-content: space-between; align-items: center; background: #f8fafc; padding: 12px; border-radius: 8px; border: 1px solid #e2e8f0; margin-bottom: 8px;">
                        <div style="text-align: left;">
                            <div style="font-weight: 700; color: #1e293b; font-size: 0.9rem;">${venta.cliente_nombre || 'Cliente General'}</div>
                            <div style="font-size: 0.75rem; color: #64748b; margin-top: 2px;">
                                <strong>${venta.codigo_espera}</strong> • ${fecha}
                            </div>
                            <div style="font-weight: 600; color: #0f766e; font-size: 0.85rem; margin-top: 4px;">
                                Total: Q${parseFloat(venta.total).toFixed(2)}
                            </div>
                        </div>
                        <button onclick="recuperarVentaEspera(${venta.id})" style="background: #10b981; color: white; border: none; padding: 8px 12px; border-radius: 6px; font-weight: 600; cursor: pointer; font-size: 0.8rem; transition: background 0.2s;">
                            ⚡ Recuperar
                        </button>
                    </div>
                `;
            });
            container.innerHTML = html;
        } else {
            container.innerHTML = `
                <div style="text-align: center; padding: 2rem; color: #94a3b8;">
                    <div style="font-size: 2.5rem; margin-bottom: 8px;">📂</div>
                    <p style="margin: 0; font-weight: 600; color: #475569;">No hay ventas en espera</p>
                    <p style="margin: 4px 0 0 0; font-size: 0.8rem; color: #64748b;">Las ventas en espera aparecerán aquí.</p>
                </div>
            `;
        }
    } catch (err) {
        console.error(err);
        container.innerHTML = `
            <div style="text-align: center; padding: 2rem; color: #ef4444;">
                Error al cargar el listado
            </div>
        `;
    }
}

async function recuperarVentaEspera(id) {
    if (!confirm("¿Desea recuperar esta venta en espera? Se cargará al carrito activo.")) {
        return;
    }

    try {
        const response = await fetch('api/ventas/recuperar_espera.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ id: id })
        });

        const data = await response.json();

        if (data.success && data.data) {
            cart.items = data.data.items;
            cart.save();
            await cart.render();

            const modalEspera = document.getElementById('modalVentasEspera');
            if (modalEspera) modalEspera.style.display = 'none';

            cart.showToast("⚡ Venta recuperada con éxito");
        } else {
            alert("Error al recuperar venta: " + (data.error || "Desconocido"));
        }
    } catch (err) {
        console.error(err);
        alert("Error de conexión al recuperar la venta");
    }
}