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',
        'raz_pro': 'p.razon_social'
    };
    return map[col] || 'a.nombre';
}

function buildWhere(req) {
    var idEmpresa = parseInt(req.query.id_empresa);
    var buscar = req.query.buscar || '';
    var soloConStock = req.query.solo_con_stock === 'true';
    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 (buscar) {
        where += ' AND (a.cod_articulo LIKE @buscar OR a.cod_vta LIKE @buscar OR a.nombre LIKE @buscar OR p.razon_social LIKE @buscar)';
        params.buscar = { type: db.sql.NVarChar(100), value: '%' + buscar + '%' };
    }

    if (soloConStock) {
        where += ' AND ISNULL(a.stock, 0) > 0';
    }

    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 };
}

router.get('/stock-valorizado', 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 || 'nom_fam';
        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',
            'raz_pro': 'p.razon_social',
            'existencia': 'ISNULL(a.stock, 0)',
            'precio_unitario': 'ISNULL(a.costo_promedio, 0)',
            'valor_total': 'ISNULL(a.stock, 0) * ISNULL(a.costo_promedio, 0)'
        };
        var orderSql = sortMap[sort] || 'f.nombre';
        if (order === 'DESC') orderSql += ' DESC'; else orderSql += ' ASC';

        var countSql = `SELECT COUNT(*) AS total FROM articulos a LEFT JOIN familias f ON a.id_empresa = f.id_empresa AND a.id_familia = f.id_familia LEFT JOIN proveedores p ON a.id_empresa = p.id_empresa AND a.id_proveedor = p.id_proveedor ${where}`;
        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 sql = `
            SELECT
                a.id_articulo,
                a.cod_articulo,
                a.cod_vta,
                a.nombre AS nom_art,
                ISNULL(a.stock, 0) AS existencia,
                u.cod_sunat AS abe_uni,
                ISNULL(a.costo_promedio, 0) AS precio_unitario,
                (ISNULL(a.stock, 0) * ISNULL(a.costo_promedio, 0)) AS valor_total,
                ISNULL(p.razon_social, '') AS raz_pro,
                ISNULL(f.nombre, '') AS nom_fam,
                a.id_familia,
                a.id_proveedor
            FROM articulos a
            LEFT JOIN familias f ON a.id_empresa = f.id_empresa AND a.id_familia = f.id_familia
            LEFT JOIN proveedores p ON a.id_empresa = p.id_empresa AND a.id_proveedor = p.id_proveedor
            LEFT JOIN unidad_medida u ON a.id_empresa = u.id_empresa AND a.id_unidad = u.id_unidad
            ${where}
            ORDER BY ${orderSql}
            ${pagination}
        `;

        var result = await db.query(sql, 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-VALORIZADO] Error:', err.message);
        res.status(500).json({ ok: false, mensaje: 'Error al obtener stock valorizado: ' + err.message });
    }
});

router.get('/stock-valorizado/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;

        var sql = `
            SELECT
                COUNT(*) AS total_articulos,
                SUM(ISNULL(a.stock, 0)) AS total_existencia,
                SUM(ISNULL(a.stock, 0) * ISNULL(a.costo_promedio, 0)) AS total_valor
            FROM articulos a
            LEFT JOIN familias f ON a.id_empresa = f.id_empresa AND a.id_familia = f.id_familia
            LEFT JOIN proveedores p ON a.id_empresa = p.id_empresa AND a.id_proveedor = p.id_proveedor
            ${where}
        `;
        var result = await db.query(sql, params);
        var row = result[0] || {};
        res.json({
            ok: true,
            total_articulos: row.total_articulos || 0,
            total_existencia: row.total_existencia || 0,
            total_valor: row.total_valor || 0
        });
    } catch (err) {
        console.error('[STOCK-VALORIZADO] Totales error:', err.message);
        res.status(500).json({ ok: false, mensaje: err.message });
    }
});

router.get('/stock-valorizado/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 });
    }
});

router.get('/stock-valorizado/proveedores', 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_proveedor, razon_social FROM proveedores WHERE id_empresa = @id_empresa AND estado = 1 ORDER BY razon_social`,
            { 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;
