/**
 * Base de Datos Offline usando Dexie.js
 * Permite buscar productos y guardar ventas cuando no hay conexión.
 */

const db = new Dexie("PosOfflineDB");

// Definición del esquema (Tablas y sus índices)
db.version(1).stores({
    productos: 'id, codigo, nombre, laboratorio, codigo_barra',
    ventas_pendientes: '++id, fecha, total'
});

const OfflineDB = {
    // ---- PRODUCTOS Offline ----
    
    // Limpiar y poblar la tabla de productos localmente
    async syncProductos(productosGenerales) {
        try {
            await db.productos.clear();
            await db.productos.bulkPut(productosGenerales);
            console.log(`✅ Catálogo offline actualizado: ${productosGenerales.length} productos.`);
            return true;
        } catch (error) {
            console.error('❌ Error guardando productos en Dexie:', error);
            return false;
        }
    },

    // Buscar productos (similar a api/productos/buscar.php)
    async buscarProductos(query) {
        if (!query) {
            return await db.productos.limit(50).toArray(); // Si no hay query, retornar primeros 50
        }

        const lowerQuery = query.toLowerCase();
        
        // Filtro manual sobre la DB local (puede ser pesado con muchos items, 
        // pero Dexie es rápido. Para apps gigantes se usan índices complejos)
        const resultados = await db.productos.filter(producto => {
            return (producto.nombre && producto.nombre.toLowerCase().includes(lowerQuery)) ||
                   (producto.codigo && producto.codigo.toLowerCase().includes(lowerQuery)) ||
                   (producto.laboratorio && producto.laboratorio.toLowerCase().includes(lowerQuery)) ||
                   (producto.codigo_barra && producto.codigo_barra.toLowerCase().includes(lowerQuery));
        }).limit(50).toArray();
        
        return resultados;
    },

    // Buscar producto exacto por código de barra
    async buscarPorCodigoBarra(codigo_barra) {
        return await db.productos.where('codigo_barra').equals(codigo_barra).first();
    },

    // ---- VENTAS Offline ----

    // Guardar una venta que no se pudo procesar online
    async guardarVentaPendiente(datosVenta) {
        try {
            datosVenta.fecha = new Date().toISOString();
            await db.ventas_pendientes.add(datosVenta);
            console.log('📦 Venta guardada en local (Offline).');
            return true;
        } catch (error) {
            console.error('❌ Error guardando venta pendiente:', error);
            return false;
        }
    },

    // Obtener todas las ventas guardadas localmente
    async obtenerVentasPendientes() {
        return await db.ventas_pendientes.orderBy('id').toArray();
    },

    // Borrar una venta que ya se sincronizó con éxito (subió al servidor)
    async borrarVentaSincronizada(ventaLocalId) {
        await db.ventas_pendientes.delete(ventaLocalId);
    },
    
    // Contar pendientes
    async contarVentasPendientes() {
        return await db.ventas_pendientes.count();
    }
};

window.OfflineDB = OfflineDB;
