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

function buildWhere(req) {
    var idEmpresa = parseInt(req.query.id_empresa);
    var idArticulo = parseInt(req.query.id_articulo) || 0;
    var fechaDesde = req.query.fecha_desde || '';
    var fechaHasta = req.query.fecha_hasta || '';
    var idSucursal = req.query.id_sucursal ? parseInt(req.query.id_sucursal) : null;

    var conditions = ['m.id_empresa = @id_empresa', 'm.id_articulo = @id_articulo'];
    var params = {
        id_empresa: { type: db.sql.Int, value: idEmpresa },
        id_articulo: { type: db.sql.Int, value: idArticulo }
    };

    if (idSucursal) {
        conditions.push('m.id_sucursal = @id_sucursal');
        params.id_sucursal = { type: db.sql.Int, value: idSucursal };
    }

    if (fechaDesde) {
        conditions.push("m.fecha_movimiento >= @fecha_desde");
        params.fecha_desde = { type: db.sql.Date, value: fechaDesde };
    }
    if (fechaHasta) {
        conditions.push("m.fecha_movimiento <= @fecha_hasta");
        params.fecha_hasta = { type: db.sql.Date, value: fechaHasta };
    }

    return { where: conditions.join(' AND '), params: params };
}

router.get('/kardex-articulo', async function(req, res) {
    try {
        var idEmpresa = parseInt(req.query.id_empresa);
        var idArticulo = parseInt(req.query.id_articulo) || 0;
        if (!idEmpresa || !idArticulo) return res.json({ ok: true, data: [], articulo: null });

        var built = buildWhere(req);

        var artSql = "SELECT a.cod_articulo, a.nombre AS nom_art, ISNULL(f.nombre, '') AS nom_fam, ISNULL(a.stock, 0) AS stock_actual, ISNULL(a.costo_promedio, 0) AS costo_promedio FROM articulos a LEFT JOIN familias f ON a.id_empresa = f.id_empresa AND a.id_familia = f.id_familia WHERE a.id_empresa = @id_empresa AND a.id_articulo = @id_articulo";
        var numOcsSql = "(SELECT STRING_AGG(x.oc_ref, ', ') FROM (SELECT DISTINCT CAST(d.ejercicio AS VARCHAR) + '-' + d.num_oc AS oc_ref FROM guias_remision_det d WHERE d.id_guia = m.id_documento AND d.id_empresa = m.id_empresa AND d.num_oc IS NOT NULL) x) AS num_ocs";
        var dataSql = "SELECT sub.* FROM (SELECT m.id_movimiento, m.fecha_movimiento, m.tipo, m.documento, m.id_documento, " + numOcsSql + ", ISNULL(m.cantidad, 0) AS cantidad, ISNULL(m.costo_unitario, 0) AS costo_unitario, ISNULL(m.costo_total, 0) AS costo_total, CASE WHEN m.tipo = 'E' THEN ISNULL(m.cantidad, 0) ELSE 0 END AS ent_cant, CASE WHEN m.tipo = 'E' THEN ISNULL(m.costo_unitario, 0) ELSE 0 END AS ent_pu, CASE WHEN m.tipo = 'E' THEN ISNULL(m.costo_total, 0) ELSE 0 END AS ent_total, CASE WHEN m.tipo = 'S' THEN ISNULL(m.cantidad, 0) ELSE 0 END AS sal_cant, CASE WHEN m.tipo = 'S' THEN ISNULL(m.costo_unitario, 0) ELSE 0 END AS sal_pu, CASE WHEN m.tipo = 'S' THEN ISNULL(m.costo_total, 0) ELSE 0 END AS sal_total, SUM(CASE WHEN m.tipo = 'E' THEN ISNULL(m.cantidad, 0) ELSE -ISNULL(m.cantidad, 0) END) OVER (ORDER BY m.fecha_movimiento, m.id_movimiento ROWS UNBOUNDED PRECEDING) AS saldo_cant, SUM(CASE WHEN m.tipo = 'E' THEN ISNULL(m.costo_total, 0) ELSE -ISNULL(m.costo_total, 0) END) OVER (ORDER BY m.fecha_movimiento, m.id_movimiento ROWS UNBOUNDED PRECEDING) AS saldo_total FROM movimiento_almacen m WHERE " + built.where + ") sub ORDER BY sub.fecha_movimiento, sub.id_movimiento";

        var articuloResult = await db.query(artSql, built.params);
        var articulo = (articuloResult && articuloResult.length > 0) ? articuloResult[0] : null;
        var dataResult = await db.query(dataSql, built.params);

        res.json({ ok: true, data: dataResult || [], articulo: articulo });
    } catch (err) {
        console.error('[KARDEX-ARTICULO] Error:', err.message);
        res.status(500).json({ ok: false, mensaje: 'Error: ' + err.message });
    }
});

router.get('/kardex-articulo/articulos', async function(req, res) {
    try {
        var idEmpresa = parseInt(req.query.id_empresa);
        if (!idEmpresa) return res.json({ ok: true, data: [] });
        var idSucursal = req.query.id_sucursal ? parseInt(req.query.id_sucursal) : null;

        var params = { id_empresa: { type: db.sql.Int, value: idEmpresa } };
        var whereExtra = 'a.id_empresa = @id_empresa AND a.estado = 1';
        if (idSucursal) {
            whereExtra += ' AND a.id_sucursal = @id_sucursal';
            params.id_sucursal = { type: db.sql.Int, value: idSucursal };
        }
        var result = await db.query("SELECT a.id_articulo, a.cod_articulo, a.nombre AS nom_art FROM articulos a WHERE " + whereExtra + " ORDER BY a.cod_articulo", params);
        res.json({ ok: true, data: result });
    } catch (err) {
        console.error('[KARDEX-ARTICULO] Error articulos:', err.message);
        res.status(500).json({ ok: false, mensaje: 'Error: ' + err.message });
    }
});

module.exports = router;