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


// ...

router.get('/transportistas', async function(req, res) {
    try {
        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) : 50;
        var sinPaginacion = limit <= 0;
        var sort = req.query.sort || 'razon_social';
        var order = req.query.order === 'DESC' ? 'DESC' : 'ASC';
        var estado = req.query.estado;
        var filtros = req.query.filtros ? JSON.parse(req.query.filtros) : null;

        var where = 'WHERE 1=1';
        var params = {};

        if (!req.query.id_empresa) {
            return res.status(400).json({ ok: false, mensaje: 'id_empresa es requerido' });
        }
        where += ' AND t.id_empresa = @id_empresa';
        params.id_empresa = { type: db.sql.Int, value: parseInt(req.query.id_empresa) };

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

        if (buscar) {
            where += ' AND (t.cod_transportista LIKE @buscar OR t.razon_social LIKE @buscar OR t.num_documento LIKE @buscar OR t.email LIKE @buscar)';
            params.buscar = { type: db.sql.NVarChar(100), value: '%' + buscar + '%' };
        }

        if (estado !== undefined && estado !== '') {
            where += ' AND t.estado = @estado';
            params.estado = { type: db.sql.Bit, value: parseInt(estado) };
        }

        if (filtros) {
            for (var col in filtros) {
                var vals = Array.isArray(filtros[col]) ? filtros[col] : String(filtros[col]).split('\x01');
                var placeholders = vals.map(function(v, i) { return '@f_' + col + '_' + i; });
                where += ' AND ' + col + ' IN (' + placeholders.join(',') + ')';
                vals.forEach(function(v, i) {
                    params['f_' + col + '_' + i] = { type: db.sql.NVarChar(100), value: v.trim() };
                });
            }
        }

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

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

        var selectCols = 't.id_transportista, t.id_sucursal, t.cod_transportista, t.tipo_documento, t.num_documento, t.razon_social, t.nombre_comercial, t.direccion, t.telefono, t.email, t.estado, t.fecha_creacion';
        var allowedSort = { cod_transportista: 't.cod_transportista', razon_social: 't.razon_social', nombre_comercial: 't.nombre_comercial', num_documento: 't.num_documento', email: 't.email', estado: 't.estado', fecha_creacion: 't.fecha_creacion' };
        var sortCol = allowedSort[sort] || 't.razon_social';

        var sqlData;
        if (sinPaginacion) {
            sqlData = 'SELECT ' + selectCols + ' FROM transportistas t ' + where + ' ORDER BY ' + sortCol + ' ' + order;
        } else {
            var offset = (page - 1) * limit;
            sqlData = 'SELECT ' + selectCols + ' FROM transportistas t ' + 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('[TRANSPORTISTAS] Error al listar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al listar transportistas' });
    }
});

router.get('/transportistas/:id', async function(req, res) {
    try {
        var idEmpresa = req.query.id_empresa;
        if (!idEmpresa) {
            return res.status(400).json({ ok: false, mensaje: 'id_empresa es requerido' });
        }
        var data = await db.query('SELECT t.id_transportista, t.id_empresa, t.id_sucursal, t.cod_transportista, t.tipo_documento, t.num_documento, t.razon_social, t.nombre_comercial, t.direccion, t.telefono, t.email, t.estado FROM transportistas t WHERE t.id_transportista = @id AND t.id_empresa = @id_empresa', {
            id: { type: db.sql.Int, value: parseInt(req.params.id) },
            id_empresa: { type: db.sql.Int, value: parseInt(idEmpresa) }
        });
        if (data.length === 0) return res.status(404).json({ ok: false, mensaje: 'Transportista no encontrado' });
        res.json({ ok: true, data: data[0] });
    } catch (error) {
        console.error('[TRANSPORTISTAS] Error al obtener:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al obtener transportista' });
    }
});

router.post('/transportistas', async function(req, res) {
    try {
        var cod = (req.body.cod_transportista || '').toString().trim().toUpperCase();
        var razonSocial = (req.body.razon_social || '').toString().trim().toUpperCase();
        var nombreComercial = (req.body.nombre_comercial || '').toString().trim().toUpperCase();
        var tipoDoc = req.body.tipo_documento || null;
        var numDoc = (req.body.num_documento || '').toString().trim().toUpperCase();
        var direccion = (req.body.direccion || '').toString().trim().toUpperCase();
        var telefono = (req.body.telefono || '').toString().trim();
        var email = (req.body.email || '').toString().trim();
        var estado = req.body.estado !== undefined ? (req.body.estado ? 1 : 0) : 1;
        var idEmpresa = parseInt(req.body.id_empresa);
        var idSucursal = req.body.id_sucursal ? parseInt(req.body.id_sucursal) : null;

        if (!cod) { return res.status(400).json({ ok: false, mensaje: 'El código es requerido' }); }
        if (!razonSocial) { return res.status(400).json({ ok: false, mensaje: 'La razón social es requerida' }); }
        if (!idEmpresa) { return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' }); }

        var dup = await db.query('SELECT COUNT(*) as cnt FROM transportistas WHERE cod_transportista = @cod AND id_empresa = @emp', {
            cod: { type: db.sql.NVarChar(6), value: cod },
            emp: { type: db.sql.Int, value: idEmpresa }
        });
        if (dup[0].cnt > 0) {
            return res.status(400).json({ ok: false, mensaje: 'El código de transportista ya existe para esta empresa' });
        }

        var result = await db.query(
            'INSERT INTO transportistas (id_empresa, id_sucursal, cod_transportista, tipo_documento, num_documento, razon_social, nombre_comercial, direccion, telefono, email, estado) VALUES (@id_empresa, @id_sucursal, @cod, @tipo_doc, @num_doc, @razon_social, @nombre_comercial, @direccion, @telefono, @email, @estado); SELECT SCOPE_IDENTITY() as id',
            {
                id_empresa: { type: db.sql.Int, value: idEmpresa },
                id_sucursal: { type: db.sql.Int, value: idSucursal },
                cod: { type: db.sql.NVarChar(6), value: cod },
                tipo_doc: { type: db.sql.NVarChar(50), value: tipoDoc },
                num_doc: { type: db.sql.NVarChar(20), value: numDoc },
                razon_social: { type: db.sql.NVarChar(200), value: razonSocial },
                nombre_comercial: { type: db.sql.NVarChar(200), value: nombreComercial || null },
                direccion: { type: db.sql.NVarChar(200), value: direccion || null },
                telefono: { type: db.sql.NVarChar(20), value: telefono || null },
                email: { type: db.sql.NVarChar(100), value: email || null },
                estado: { type: db.sql.Bit, value: estado }
            }
        );
        res.json({ ok: true, mensaje: 'Transportista creado', data: { id_transportista: result[0].id } });
    } catch (error) {
        console.error('[TRANSPORTISTAS] Error al crear:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al crear transportista' });
    }
});

router.put('/transportistas/:id', async function(req, res) {
    try {
        var id = parseInt(req.params.id);
        var idEmpresa = req.query.id_empresa || req.body.id_empresa;
        if (!idEmpresa) {
            return res.status(400).json({ ok: false, mensaje: 'id_empresa es requerido' });
        }
        idEmpresa = parseInt(idEmpresa);
        var cod = (req.body.cod_transportista || '').toString().trim().toUpperCase();
        var razonSocial = (req.body.razon_social || '').toString().trim().toUpperCase();
        var nombreComercial = (req.body.nombre_comercial || '').toString().trim().toUpperCase();
        var tipoDoc = req.body.tipo_documento || null;
        var numDoc = (req.body.num_documento || '').toString().trim().toUpperCase();
        var direccion = (req.body.direccion || '').toString().trim().toUpperCase();
        var telefono = (req.body.telefono || '').toString().trim();
        var email = (req.body.email || '').toString().trim();
        var estado = req.body.estado !== undefined ? (req.body.estado ? 1 : 0) : 1;
        var idSucursal = req.body.id_sucursal ? parseInt(req.body.id_sucursal) : null;

        if (!cod) { return res.status(400).json({ ok: false, mensaje: 'El código es requerido' }); }
        if (!razonSocial) { return res.status(400).json({ ok: false, mensaje: 'La razón social es requerida' }); }

        var dup = await db.query('SELECT COUNT(*) as cnt FROM transportistas WHERE cod_transportista = @cod AND id_empresa = @emp AND id_transportista != @id', {
            cod: { type: db.sql.NVarChar(6), value: cod },
            emp: { type: db.sql.Int, value: idEmpresa },
            id: { type: db.sql.Int, value: id }
        });
        if (dup[0].cnt > 0) {
            return res.status(400).json({ ok: false, mensaje: 'El código de transportista ya existe para esta empresa' });
        }

        await db.execute(
            'UPDATE transportistas SET cod_transportista = @cod, tipo_documento = @tipo_doc, num_documento = @num_doc, razon_social = @razon_social, nombre_comercial = @nombre_comercial, direccion = @direccion, telefono = @telefono, email = @email, estado = @estado, id_sucursal = @id_sucursal WHERE id_transportista = @id AND id_empresa = @id_empresa',
            {
                cod: { type: db.sql.NVarChar(6), value: cod },
                tipo_doc: { type: db.sql.NVarChar(50), value: tipoDoc },
                num_doc: { type: db.sql.NVarChar(20), value: numDoc },
                razon_social: { type: db.sql.NVarChar(200), value: razonSocial },
                nombre_comercial: { type: db.sql.NVarChar(200), value: nombreComercial || null },
                direccion: { type: db.sql.NVarChar(200), value: direccion || null },
                telefono: { type: db.sql.NVarChar(20), value: telefono || null },
                email: { type: db.sql.NVarChar(100), value: email || null },
                estado: { type: db.sql.Bit, value: estado },
                id_sucursal: { type: db.sql.Int, value: idSucursal },
                id: { type: db.sql.Int, value: id },
                id_empresa: { type: db.sql.Int, value: idEmpresa }
            }
        );
        res.json({ ok: true, mensaje: 'Transportista actualizado' });
    } catch (error) {
        console.error('[TRANSPORTISTAS] Error al actualizar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al actualizar transportista' });
    }
});

router.delete('/transportistas/:id', async function(req, res) {
    try {
        var id = parseInt(req.params.id);
        var idEmpresa = req.query.id_empresa;
        if (!idEmpresa) {
            return res.status(400).json({ ok: false, mensaje: 'id_empresa es requerido' });
        }
        var refs = await db.query('SELECT COUNT(*) as cnt FROM vehiculos WHERE id_transportista = @id AND id_empresa = @id_empresa AND estado = 1', {
            id: { type: db.sql.Int, value: id },
            id_empresa: { type: db.sql.Int, value: parseInt(idEmpresa) }
        });
        if (refs[0].cnt > 0) {
            return res.status(400).json({ ok: false, mensaje: 'No se puede desactivar: el transportista tiene vehículos activos asociados' });
        }
        await db.execute('UPDATE transportistas SET estado = 0 WHERE id_transportista = @id AND id_empresa = @id_empresa', {
            id: { type: db.sql.Int, value: id },
            id_empresa: { type: db.sql.Int, value: parseInt(idEmpresa) }
        });
        res.json({ ok: true, mensaje: 'Transportista desactivado' });
    } catch (error) {
        console.error('[TRANSPORTISTAS] Error al desactivar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al desactivar transportista' });
    }
});

module.exports = router;
