const express = require('express');
const router = express.Router();
const db = require('../config/db');

function getColSql(col) {
    var map = {
        'cod_articulo': 'a.cod_articulo',
        'cod_vta': 'a.cod_vta',
        'nom_art': 'a.nombre',
        'nom_fam': 'f.nombre'
    };
    return map[col] || 'a.nombre';
}

function buildWhere(req) {
    var idEmpresa = parseInt(req.query.id_empresa);
    var buscar = req.query.buscar || '';
    var idFamilia = req.query.id_familia || '';
    var fechaCorte = req.query.fecha_corte || '';
    var idSucursal = req.query.id_sucursal ? parseInt(req.query.id_sucursal) : null;

    var where = 'WHERE a.id_empresa = @id_empresa AND a.estado = 1';
    var params = {
        id_empresa: { type: db.sql.Int, value: idEmpresa }
    };

    if (idSucursal) {
        where += ' AND a.id_sucursal = @id_sucursal';
        params.id_sucursal = { type: db.sql.Int, value: idSucursal };
    }

    if (idFamilia) {
        where += ' AND a.id_familia = @id_familia';
        params.id_familia = { type: db.sql.Int, value: parseInt(idFamilia) };
    }

    if (buscar) {
        where += ' AND (a.cod_articulo LIKE @buscar OR a.cod_vta LIKE @buscar OR a.nombre LIKE @buscar)';
        params.buscar = { type: db.sql.NVarChar(100), value: '%' + buscar + '%' };
    }

    if (req.query.filtros) {
        try {
            var filtros = JSON.parse(req.query.filtros);
            for (var col in filtros) {
                if (filtros.hasOwnProperty(col) && filtros[col]) {
                    var vals = (Array.isArray(filtros[col]) ? filtros[col] : String(filtros[col]).split('\x01')).map(function(v) { return v.trim(); });
                    if (vals.length === 1) {
                        where += ' AND ' + getColSql(col) + ' = @filtro_' + col;
                        params['filtro_' + col] = { type: db.sql.NVarChar(200), value: vals[0] };
                    } else {
                        var placeholders = vals.map(function(_, i) { return '@filtro_' + col + '_' + i; }).join(',');
                        where += ' AND ' + getColSql(col) + ' IN (' + placeholders + ')';
                        vals.forEach(function(v, i) {
                            params['filtro_' + col + '_' + i] = { type: db.sql.NVarChar(200), value: v };
                        });
                    }
                }
            }
        } catch(e) {}
    }

    return { where: where, params: params, fechaCorte: fechaCorte };
}

function buildStockSql(where, params, fechaCorte, limit, offset) {
    var fechaParam = '';
    if (fechaCorte) {
        params.fecha_corte = { type: db.sql.Date, value: new Date(fechaCorte) };
        fechaParam = 'AND ISNULL(m.fecha_movimiento, GETDATE()) <= @fecha_corte';
    }

    var dateFilter = fechaCorte ? fechaParam : '';

    var sql = `
        SELECT
            a.id_articulo,
            a.cod_articulo,
            a.cod_vta,
            a.nombre AS nom_art,
            ISNULL(f.nombre, '') AS nom_fam,
            a.id_familia,
            u.cod_sunat AS und_prd,
            ISNULL(SUM(CASE WHEN m.tipo = 'E' THEN m.cantidad ELSE 0 END), 0) -
            ISNULL(SUM(CASE WHEN m.tipo = 'S' THEN m.cantidad ELSE 0 END), 0) AS stock
        FROM articulos a
        LEFT JOIN familias f ON a.id_empresa = f.id_empresa AND a.id_familia = f.id_familia
        LEFT JOIN unidad_medida u ON a.id_empresa = u.id_empresa AND a.id_unidad = u.id_unidad
        LEFT JOIN movimiento_almacen m ON a.id_articulo = m.id_articulo AND a.id_empresa = m.id_empresa ${dateFilter}
        ${where}
        GROUP BY a.id_articulo, a.cod_articulo, a.cod_vta, a.nombre, f.nombre, a.id_familia, u.cod_sunat
        HAVING ISNULL(SUM(CASE WHEN m.tipo = 'E' THEN m.cantidad ELSE 0 END), 0) -
               ISNULL(SUM(CASE WHEN m.tipo = 'S' THEN m.cantidad ELSE 0 END), 0) <> 0
    `;

    return sql;
}

router.get('/stock-corte-fecha', async function(req, res) {
    try {
        var idEmpresa = parseInt(req.query.id_empresa);
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'id_empresa es requerido' });

        var page = parseInt(req.query.page) || 1;
        var limit = req.query.limit !== undefined && req.query.limit !== '' ? parseInt(req.query.limit) : 50;
        if (isNaN(limit)) limit = 50;
        var offset = (page - 1) * limit;
        var sort = req.query.sort || 'cod_vta';
        var order = req.query.order === 'DESC' ? 'DESC' : 'ASC';

        var built = buildWhere(req);
        var where = built.where;
        var params = built.params;

        var sortMap = {
            'cod_articulo': 'a.cod_articulo',
            'cod_vta': 'a.cod_vta',
            'nom_art': 'a.nombre',
            'nom_fam': 'f.nombre',
            'stock': 'stock'
        };
        var orderSql = sortMap[sort] || 'a.cod_vta';
        if (order === 'DESC') orderSql += ' DESC'; else orderSql += ' ASC';

        var countSql = `
            SELECT COUNT(*) AS total FROM (
                SELECT a.cod_articulo
                FROM articulos a
                LEFT JOIN familias f ON a.id_empresa = f.id_empresa AND a.id_familia = f.id_familia
                LEFT JOIN movimiento_almacen m ON a.id_articulo = m.id_articulo AND a.id_empresa = m.id_empresa
                    ${built.fechaCorte ? 'AND ISNULL(m.fecha_movimiento, GETDATE()) <= @fecha_corte' : ''}
                ${where}
                GROUP BY a.cod_articulo
                HAVING ISNULL(SUM(CASE WHEN m.tipo = 'E' THEN m.cantidad ELSE 0 END), 0) -
                       ISNULL(SUM(CASE WHEN m.tipo = 'S' THEN m.cantidad ELSE 0 END), 0) <> 0
            ) sub
        `;
        if (built.fechaCorte) {
            params.fecha_corte = { type: db.sql.Date, value: new Date(built.fechaCorte) };
        }
        var countResult = await db.query(countSql, params);
        var total = countResult[0] ? countResult[0].total : 0;

        var pagination = limit > 0 ? 'OFFSET @offset ROWS FETCH NEXT @limit ROWS ONLY' : '';
        if (limit > 0) {
            params.offset = { type: db.sql.Int, value: offset };
            params.limit = { type: db.sql.Int, value: limit };
        }

        var dataSql = buildStockSql(where, params, built.fechaCorte, limit, offset);
        dataSql += ` ORDER BY ${orderSql} ${pagination}`;

        var result = await db.query(dataSql, params);

        var totalPaginas = limit > 0 ? Math.ceil(total / limit) : 1;
        res.json({ ok: true, data: result, total: total, totalPaginas: totalPaginas });

    } catch (err) {
        console.error('[STOCK-CORTE-FECHA] Error:', err.message);
        res.status(500).json({ ok: false, mensaje: 'Error al obtener stock por corte: ' + err.message });
    }
});

router.get('/stock-corte-fecha/totales', async function(req, res) {
    try {
        var idEmpresa = parseInt(req.query.id_empresa);
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'id_empresa es requerido' });

        var built = buildWhere(req);
        var where = built.where;
        var params = built.params;

        if (built.fechaCorte) {
            params.fecha_corte = { type: db.sql.Date, value: new Date(built.fechaCorte) };
        }

        var sql = `
            SELECT
                COUNT(*) AS total_articulos,
                SUM(sub.stock) AS total_stock
            FROM (
                SELECT a.cod_articulo,
                    ISNULL(SUM(CASE WHEN m.tipo = 'E' THEN m.cantidad ELSE 0 END), 0) -
                    ISNULL(SUM(CASE WHEN m.tipo = 'S' THEN m.cantidad ELSE 0 END), 0) AS stock
                FROM articulos a
                LEFT JOIN familias f ON a.id_empresa = f.id_empresa AND a.id_familia = f.id_familia
                LEFT JOIN movimiento_almacen m ON a.id_articulo = m.id_articulo AND a.id_empresa = m.id_empresa
                    ${built.fechaCorte ? 'AND ISNULL(m.fecha_movimiento, GETDATE()) <= @fecha_corte' : ''}
                ${where}
                GROUP BY a.cod_articulo
                HAVING ISNULL(SUM(CASE WHEN m.tipo = 'E' THEN m.cantidad ELSE 0 END), 0) -
                       ISNULL(SUM(CASE WHEN m.tipo = 'S' THEN m.cantidad ELSE 0 END), 0) <> 0
            ) sub
        `;
        var result = await db.query(sql, params);
        var row = result[0] || {};
        res.json({
            ok: true,
            total_articulos: row.total_articulos || 0,
            total_stock: row.total_stock || 0
        });
    } catch (err) {
        console.error('[STOCK-CORTE-FECHA] Totales error:', err.message);
        res.status(500).json({ ok: false, mensaje: err.message });
    }
});

router.get('/stock-corte-fecha/familias', async function(req, res) {
    try {
        var idEmpresa = parseInt(req.query.id_empresa);
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'id_empresa es requerido' });
        var result = await db.query(
            `SELECT id_familia, nombre FROM familias WHERE id_empresa = @id_empresa AND estado = 1 ORDER BY nombre`,
            { id_empresa: { type: db.sql.Int, value: idEmpresa } }
        );
        res.json({ ok: true, data: result });
    } catch (err) {
        res.status(500).json({ ok: false, mensaje: err.message });
    }
});

module.exports = router;
