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


// ...

router.get('/formas-pago', async function(req, res) {
    try {
        var idEmpresa = req.query.id_empresa ? parseInt(req.query.id_empresa) : null;
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' });

        var buscar = req.query.buscar || '';
        var page = req.query.page !== undefined ? parseInt(req.query.page) : 1;
        var limit = req.query.limit !== undefined ? parseInt(req.query.limit) : 10;
        var sinPaginacion = limit <= 0;
        var sort = req.query.sort || 'cod_fpa';
        var order = req.query.order === 'DESC' ? 'DESC' : 'ASC';
        var idCondicion = req.query.id_condicion;

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

        if (req.query.id_sucursal) {
            where += ' AND fp.id_sucursal = @id_sucursal';
            params.id_sucursal = { type: db.sql.Int, value: parseInt(req.query.id_sucursal) };
        }

        if (idCondicion) {
            where += ' AND fp.id_condicion = @id_condicion';
            params.id_condicion = { type: db.sql.Int, value: parseInt(idCondicion) };
        }

        if (buscar) {
            where += ' AND (fp.cod_fpa LIKE @buscar OR fp.nom_fpa LIKE @buscar)';
            params.buscar = { type: db.sql.NVarChar(50), value: '%' + buscar + '%' };
        }

        if (await dh.tryDistinct(req, res, { db, table: 'formas_pago', alias: 'fp', joins: 'LEFT JOIN condiciones_pago cp ON fp.id_empresa = cp.id_empresa AND fp.id_condicion = cp.id_condicion', where, params, bitColumns: ['estado'], colMap: { condicion_nombre: 'cp.nombre' } })) return;

        var allowedSort = { cod_fpa: 'fp.cod_fpa', nom_fpa: 'fp.nom_fpa', dia_fpa: 'fp.dia_fpa' };
        var sortCol = allowedSort[sort] || 'fp.cod_fpa';

        var sqlCount = 'SELECT COUNT(*) as total FROM formas_pago fp' + where;
        var countResult = await db.query(sqlCount, params);
        var total = countResult[0].total;
        var totalPaginas = Math.ceil(total / Math.abs(limit));

        var sqlData;
        if (sinPaginacion) {
            sqlData = 'SELECT fp.id_forma_pago, fp.id_sucursal, fp.id_condicion, fp.cod_fpa, fp.nom_fpa, fp.dia_fpa, fp.estado, cp.nombre AS condicion_nombre FROM formas_pago fp LEFT JOIN condiciones_pago cp ON fp.id_empresa = cp.id_empresa AND fp.id_condicion = cp.id_condicion' + where + ' ORDER BY ' + sortCol + ' ' + order;
        } else {
            var offset = (page - 1) * limit;
            sqlData = 'SELECT fp.id_forma_pago, fp.id_sucursal, fp.id_condicion, fp.cod_fpa, fp.nom_fpa, fp.dia_fpa, fp.estado, cp.nombre AS condicion_nombre FROM formas_pago fp LEFT JOIN condiciones_pago cp ON fp.id_empresa = cp.id_empresa AND fp.id_condicion = cp.id_condicion' + where + ' ORDER BY ' + sortCol + ' ' + order + ' OFFSET @offset ROWS FETCH NEXT @limit ROWS ONLY';
            params.offset = { type: db.sql.Int, value: offset };
            params.limit = { type: db.sql.Int, value: limit };
        }

        var data = await db.query(sqlData, params);
        res.json({ ok: true, data: data, total: total, totalPaginas: totalPaginas, page: page });
    } catch (error) {
        console.error('[FORMAS_PAGO] Error listar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al listar formas de pago' });
    }
});

router.get('/formas-pago/next/:id_condicion', async function(req, res) {
    try {
        var idEmpresa = req.query.id_empresa ? parseInt(req.query.id_empresa) : null;
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' });

        var result = await db.query(
            'SELECT ISNULL(MAX(CAST(cod_fpa AS INT)), 0) + 1 AS next FROM formas_pago WHERE id_empresa = @id_empresa',
            { id_empresa: { type: db.sql.Int, value: idEmpresa } }
        );
        var next = result[0].next;
        var codigo = ('000' + next).slice(-3);
        res.json({ ok: true, data: { cod_fpa: codigo } });
    } catch (error) {
        console.error('[FORMAS_PAGO] Error next:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al generar código' });
    }
});

router.get('/formas-pago/:id', async function(req, res) {
    try {
        var idEmpresa = req.query.id_empresa ? parseInt(req.query.id_empresa) : null;
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' });

        var data = await db.query(
            'SELECT fp.id_forma_pago, fp.id_sucursal, fp.id_condicion, fp.cod_fpa, fp.nom_fpa, fp.dia_fpa, fp.estado, cp.nombre AS condicion_nombre FROM formas_pago fp LEFT JOIN condiciones_pago cp ON fp.id_empresa = cp.id_empresa AND fp.id_condicion = cp.id_condicion WHERE fp.id_empresa = @id_empresa AND fp.id_forma_pago = @id',
            { id_empresa: { type: db.sql.Int, value: idEmpresa }, id: { type: db.sql.Int, value: parseInt(req.params.id) } }
        );
        if (data.length === 0) return res.status(404).json({ ok: false, mensaje: 'Forma de pago no encontrada' });
        res.json({ ok: true, data: data[0] });
    } catch (error) {
        console.error('[FORMAS_PAGO] Error obtener:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al obtener forma de pago' });
    }
});

router.post('/formas-pago', async function(req, res) {
    try {
        var idEmpresa = req.body.id_empresa ? parseInt(req.body.id_empresa) : null;
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' });

        var idCondicion = parseInt(req.body.id_condicion);
        var codFpa = req.body.cod_fpa;
        var nomFpa = (req.body.nom_fpa || '').trim().toUpperCase();
        var diaFpa = parseInt(req.body.dia_fpa) || 0;
        var estado = req.body.estado !== undefined ? (req.body.estado ? 1 : 0) : 1;

        if (!idCondicion) return res.status(400).json({ ok: false, mensaje: 'La condición de pago es requerida' });
        if (!nomFpa) return res.status(400).json({ ok: false, mensaje: 'El nombre es requerido' });

        if (!codFpa) {
            var rows = await db.query(
                'SELECT ISNULL(MAX(CAST(cod_fpa AS INT)), 0) + 1 AS nxt FROM formas_pago WHERE id_empresa = @id_empresa',
                { id_empresa: { type: db.sql.Int, value: idEmpresa } }
            );
            codFpa = ('000' + rows[0].nxt).slice(-3);
        }

        var idSucursal = req.body.id_sucursal ? parseInt(req.body.id_sucursal) : null;
        var sql = 'INSERT INTO formas_pago (id_empresa, id_sucursal, id_condicion, cod_fpa, nom_fpa, dia_fpa, estado) VALUES (@id_empresa, @id_sucursal, @id_condicion, @cod_fpa, @nom_fpa, @dia_fpa, @estado); SELECT SCOPE_IDENTITY() as id';
        var result = await db.query(sql, {
            id_empresa: { type: db.sql.Int, value: idEmpresa },
            id_sucursal: { type: db.sql.Int, value: idSucursal },
            id_condicion: { type: db.sql.Int, value: idCondicion },
            cod_fpa: { type: db.sql.VarChar(3), value: codFpa },
            nom_fpa: { type: db.sql.NVarChar(35), value: nomFpa },
            dia_fpa: { type: db.sql.Int, value: diaFpa },
            estado: { type: db.sql.Bit, value: estado }
        });
        res.json({ ok: true, mensaje: 'Forma de pago registrada', data: { id_forma_pago: result[0].id } });
    } catch (error) {
        console.error('[FORMAS_PAGO] Error crear:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al registrar forma de pago' });
    }
});

router.put('/formas-pago/:id', async function(req, res) {
    try {
        var idEmpresa = req.body.id_empresa ? parseInt(req.body.id_empresa) : (req.query.id_empresa ? parseInt(req.query.id_empresa) : null);
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' });

        var id = parseInt(req.params.id);
        var idCondicion = parseInt(req.body.id_condicion);
        var codFpa = req.body.cod_fpa;
        var nomFpa = (req.body.nom_fpa || '').trim().toUpperCase();
        var diaFpa = parseInt(req.body.dia_fpa) || 0;
        var estado = req.body.estado !== undefined ? (req.body.estado ? 1 : 0) : 1;

        if (!idCondicion) return res.status(400).json({ ok: false, mensaje: 'La condición de pago es requerida' });
        if (!codFpa) return res.status(400).json({ ok: false, mensaje: 'El código es requerido' });
        if (!nomFpa) return res.status(400).json({ ok: false, mensaje: 'El nombre es requerido' });

        var dup = await db.query(
            'SELECT COUNT(*) as cnt FROM formas_pago WHERE id_empresa = @id_empresa AND id_condicion = @id_condicion AND cod_fpa = @cod_fpa AND id_forma_pago != @id',
            { id_empresa: { type: db.sql.Int, value: idEmpresa }, id_condicion: { type: db.sql.Int, value: idCondicion }, cod_fpa: { type: db.sql.VarChar(3), value: codFpa }, id: { type: db.sql.Int, value: id } }
        );
        if (dup[0].cnt > 0) {
            return res.status(400).json({ ok: false, mensaje: 'El código de forma de pago ya existe para esta condición' });
        }

        var sql = 'UPDATE formas_pago SET id_condicion = @id_condicion, cod_fpa = @cod_fpa, nom_fpa = @nom_fpa, dia_fpa = @dia_fpa, estado = @estado, id_sucursal = @id_sucursal WHERE id_empresa = @id_empresa AND id_forma_pago = @id';
        await db.execute(sql, {
            id_empresa: { type: db.sql.Int, value: idEmpresa },
            id_condicion: { type: db.sql.Int, value: idCondicion },
            cod_fpa: { type: db.sql.VarChar(3), value: codFpa },
            nom_fpa: { type: db.sql.NVarChar(35), value: nomFpa },
            dia_fpa: { type: db.sql.Int, value: diaFpa },
            estado: { type: db.sql.Bit, value: estado },
            id_sucursal: { type: db.sql.Int, value: req.body.id_sucursal ? parseInt(req.body.id_sucursal) : null },
            id: { type: db.sql.Int, value: id }
        });
        res.json({ ok: true, mensaje: 'Forma de pago actualizada' });
    } catch (error) {
        console.error('[FORMAS_PAGO] Error actualizar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al actualizar forma de pago' });
    }
});

router.delete('/formas-pago/:id', async function(req, res) {
    try {
        var idEmpresa = req.query.id_empresa ? parseInt(req.query.id_empresa) : null;
        if (!idEmpresa) return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' });

        await db.execute('DELETE FROM formas_pago WHERE id_empresa = @id_empresa AND id_forma_pago = @id', {
            id_empresa: { type: db.sql.Int, value: idEmpresa },
            id: { type: db.sql.Int, value: parseInt(req.params.id) }
        });
        res.json({ ok: true, mensaje: 'Forma de pago eliminada' });
    } catch (error) {
        console.error('[FORMAS_PAGO] Error eliminar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al eliminar forma de pago' });
    }
});

module.exports = router;
