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


// ...

router.get('/motivos-guia', async function(req, res) {
    try {
        var where = '';
        var params = {};
        var sort = 'mg.codigo';
        var order = 'ASC';
        var limit = 50;
        var offset = 0;

        if (req.query.sort) { sort = 'mg.' + req.query.sort; }
        if (req.query.order) { order = req.query.order.toUpperCase() === 'DESC' ? 'DESC' : 'ASC'; }
        if (req.query.limit) { limit = parseInt(req.query.limit) || 50; }
        if (req.query.page) { offset = (parseInt(req.query.page) - 1) * limit; }
        else if (req.query.offset) { offset = parseInt(req.query.offset) || 0; }

        if (req.query.buscar) {
            where = ' WHERE (mg.codigo LIKE @buscar OR mg.nombre LIKE @buscar OR mg.descripcion LIKE @buscar)';
            params.buscar = { type: db.sql.NVarChar(200), value: '%' + req.query.buscar + '%' };
        }
        if (req.query.estado !== undefined && req.query.estado !== '') {
            where += (where ? ' AND' : ' WHERE') + ' mg.activo = @activo';
            params.activo = { type: db.sql.Bit, value: req.query.estado === '1' || req.query.estado === 'true' ? 1 : 0 };
        }
        if (req.query.filtros) {
            try {
                var fc = JSON.parse(req.query.filtros);
                for (var col in fc) {
                    if (fc[col]) {
                        var vals = fc[col].split('\x01');
                        var ph = vals.map(function(v, i) { return '@f_' + col + '_' + i; });
                        where += (where ? ' AND' : ' WHERE') + ' mg.' + col + ' IN (' + ph.join(',') + ')';
                        vals.forEach(function(v, i) {
                            params['f_' + col + '_' + i] = { type: db.sql.NVarChar(200), value: v.trim() };
                        });
                    }
                }
            } catch (e) {}
        }

        if (await dh.tryDistinct(req, res, { db, table: 'motivos_guia', alias: 'mg', where, params, bitColumns: ['activo'] })) return;

        var sqlCount = 'SELECT COUNT(*) AS total FROM motivos_guia mg' + where;
        var total = await db.query(sqlCount, params);

        var sqlData = 'SELECT mg.id_motivo, mg.codigo, mg.nombre, mg.descripcion, mg.activo FROM motivos_guia mg' + where + ' ORDER BY ' + sort + ' ' + order;
        if (req.query.paginar !== 'false') {
            sqlData += ' 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[0].total, offset: offset, limit: limit });
    } catch (e) {
        console.error('[MOTIVOS GUIA] Error listar:', e.message);
        res.status(500).json({ ok: false, mensaje: 'Error al listar motivos de guía' });
    }
});

router.get('/motivos-guia/:id', async function(req, res) {
    try {
        var data = await db.query('SELECT id_motivo, codigo, nombre, descripcion, activo FROM motivos_guia WHERE id_motivo = @id', {
            id: { type: db.sql.Int, value: parseInt(req.params.id) }
        });
        if (!data || data.length === 0) return res.status(404).json({ ok: false, mensaje: 'No encontrado' });
        res.json({ ok: true, data: data[0] });
    } catch (e) {
        console.error('[MOTIVOS GUIA] Error obtener:', e.message);
        res.status(500).json({ ok: false, mensaje: 'Error al obtener motivo de guía' });
    }
});

router.post('/motivos-guia', async function(req, res) {
    try {
        var codigo = (req.body.codigo || '').trim().toUpperCase();
        var nombre = (req.body.nombre || '').trim().toUpperCase();
        var descripcion = (req.body.descripcion || '').trim().toUpperCase() || null;
        var activo = req.body.activo !== undefined ? (req.body.activo ? 1 : 0) : 1;

        if (!codigo) return res.status(400).json({ ok: false, mensaje: 'El código es requerido' });
        if (!nombre) return res.status(400).json({ ok: false, mensaje: 'El nombre es requerido' });

        var dup = await db.query('SELECT COUNT(*) AS cnt FROM motivos_guia WHERE codigo = @cod', {
            cod: { type: db.sql.VarChar(2), value: codigo }
        });
        if (dup[0].cnt > 0) return res.status(400).json({ ok: false, mensaje: 'El código ya existe' });

        var result = await db.query(
            'INSERT INTO motivos_guia (codigo, nombre, descripcion, activo) VALUES (@cod, @nom, @desc, @act); SELECT SCOPE_IDENTITY() AS id',
            {
                cod: { type: db.sql.VarChar(2), value: codigo },
                nom: { type: db.sql.NVarChar(100), value: nombre },
                desc: { type: db.sql.NVarChar(200), value: descripcion },
                act: { type: db.sql.Bit, value: activo }
            }
        );
        res.json({ ok: true, mensaje: 'Motivo de guía creado', id: result[0].id });
    } catch (e) {
        console.error('[MOTIVOS GUIA] Error crear:', e.message);
        res.status(500).json({ ok: false, mensaje: 'Error al crear motivo de guía' });
    }
});

router.put('/motivos-guia/:id', async function(req, res) {
    try {
        var id = parseInt(req.params.id);
        var codigo = (req.body.codigo || '').trim().toUpperCase();
        var nombre = (req.body.nombre || '').trim().toUpperCase();
        var descripcion = (req.body.descripcion || '').trim().toUpperCase() || null;
        var activo = req.body.activo !== undefined ? (req.body.activo ? 1 : 0) : 1;

        if (!codigo) return res.status(400).json({ ok: false, mensaje: 'El código es requerido' });
        if (!nombre) return res.status(400).json({ ok: false, mensaje: 'El nombre es requerido' });

        var dup = await db.query('SELECT COUNT(*) AS cnt FROM motivos_guia WHERE codigo = @cod AND id_motivo != @id', {
            cod: { type: db.sql.VarChar(2), value: codigo },
            id: { type: db.sql.Int, value: id }
        });
        if (dup[0].cnt > 0) return res.status(400).json({ ok: false, mensaje: 'El código ya está en uso' });

        await db.execute(
            'UPDATE motivos_guia SET codigo = @cod, nombre = @nom, descripcion = @desc, activo = @act WHERE id_motivo = @id',
            {
                cod: { type: db.sql.VarChar(2), value: codigo },
                nom: { type: db.sql.NVarChar(100), value: nombre },
                desc: { type: db.sql.NVarChar(200), value: descripcion },
                act: { type: db.sql.Bit, value: activo },
                id: { type: db.sql.Int, value: id }
            }
        );
        res.json({ ok: true, mensaje: 'Motivo de guía actualizado' });
    } catch (e) {
        console.error('[MOTIVOS GUIA] Error actualizar:', e.message);
        res.status(500).json({ ok: false, mensaje: 'Error al actualizar motivo de guía' });
    }
});

router.delete('/motivos-guia/:id', async function(req, res) {
    try {
        var tieneGuias = await db.query(
            'SELECT COUNT(*) AS cnt FROM guias_remision WHERE id_motivo = @id',
            { id: { type: db.sql.Int, value: parseInt(req.params.id) } }
        );

        if (tieneGuias[0].cnt > 0) {
            await db.execute('UPDATE motivos_guia SET activo = 0 WHERE id_motivo = @id', {
                id: { type: db.sql.Int, value: parseInt(req.params.id) }
            });
            res.json({ ok: true, mensaje: 'Motivo de guía desactivado (tiene guías asociadas)' });
        } else {
            await db.execute('DELETE FROM motivos_guia WHERE id_motivo = @id', {
                id: { type: db.sql.Int, value: parseInt(req.params.id) }
            });
            res.json({ ok: true, mensaje: 'Motivo de guía eliminado' });
        }
    } catch (e) {
        console.error('[MOTIVOS GUIA] Error eliminar:', e.message);
        res.status(500).json({ ok: false, mensaje: 'Error al eliminar motivo de guía' });
    }
});

module.exports = router;
