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


// ...

router.get('/vehiculos', 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 || 'placa';
        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 v.id_empresa = @id_empresa';
        params.id_empresa = { type: db.sql.Int, value: parseInt(req.query.id_empresa) };

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

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

        if (estado !== undefined && estado !== '') {
            where += ' AND v.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() };
                });
            }
        }

        var joinsVeh = 'LEFT JOIN transportistas t ON v.id_empresa = t.id_empresa AND v.id_transportista = t.id_transportista';
        if (await dh.tryDistinct(req, res, { db, table: 'vehiculos', alias: 'v', joins: joinsVeh, where, params, bitColumns: ['estado'] })) return;

        var joins = ' FROM vehiculos v ' + joinsVeh;
        var sqlCount = 'SELECT COUNT(*) as total' + joins + ' ' + 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 = 'v.id_vehiculo, v.id_sucursal, v.placa, v.descripcion, v.marca, v.modelo, v.anio, v.color, v.tipo_vehiculo, v.capacidad_toneladas, v.numero_ejes, v.estado, v.id_transportista, t.razon_social AS transportista_nombre';
        var allowedSort = { placa: 'v.placa', marca: 'v.marca', modelo: 'v.modelo', anio: 'v.anio', transportista_nombre: 't.razon_social', estado: 'v.estado' };
        var sortCol = allowedSort[sort] || 'v.placa';

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

router.get('/vehiculos/: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 v.id_vehiculo, v.id_empresa, v.id_sucursal, v.id_transportista, v.placa, v.descripcion, v.marca, v.modelo, v.anio, v.color, v.tipo_vehiculo, v.capacidad_toneladas, v.numero_ejes, v.estado FROM vehiculos v WHERE v.id_vehiculo = @id AND v.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: 'Vehículo no encontrado' });
        res.json({ ok: true, data: data[0] });
    } catch (error) {
        console.error('[VEHICULOS] Error al obtener:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al obtener vehículo' });
    }
});

router.post('/vehiculos', async function(req, res) {
    try {
        var placa = (req.body.placa || '').toString().trim().toUpperCase();
        var desc = (req.body.descripcion || '').toString().trim().toUpperCase();
        var marca = (req.body.marca || '').toString().trim().toUpperCase();
        var modelo = (req.body.modelo || '').toString().trim().toUpperCase();
        var color = (req.body.color || '').toString().trim().toUpperCase();
        var tipoVehiculo = (req.body.tipo_vehiculo || '').toString().trim().toUpperCase();
        var anio = req.body.anio ? parseInt(req.body.anio) : null;
        var capacidad = req.body.capacidad_toneladas ? parseFloat(req.body.capacidad_toneladas) : null;
        var numEjes = req.body.numero_ejes ? parseInt(req.body.numero_ejes) : null;
        var idTransportista = req.body.id_transportista ? parseInt(req.body.id_transportista) : null;
        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 (!placa) { return res.status(400).json({ ok: false, mensaje: 'La placa es requerida' }); }
        if (!idEmpresa) { return res.status(400).json({ ok: false, mensaje: 'Empresa requerida' }); }

        var dup = await db.query('SELECT COUNT(*) as cnt FROM vehiculos WHERE placa = @placa AND id_empresa = @emp', {
            placa: { type: db.sql.NVarChar(20), value: placa },
            emp: { type: db.sql.Int, value: idEmpresa }
        });
        if (dup[0].cnt > 0) {
            return res.status(400).json({ ok: false, mensaje: 'La placa ya existe para esta empresa' });
        }

        var result = await db.query(
            'INSERT INTO vehiculos (id_empresa, id_sucursal, id_transportista, placa, descripcion, marca, modelo, anio, color, tipo_vehiculo, capacidad_toneladas, numero_ejes, estado) VALUES (@id_empresa, @id_sucursal, @id_transportista, @placa, @descripcion, @marca, @modelo, @anio, @color, @tipo_vehiculo, @capacidad, @num_ejes, @estado); SELECT SCOPE_IDENTITY() as id',
            {
                id_empresa: { type: db.sql.Int, value: idEmpresa },
                id_sucursal: { type: db.sql.Int, value: idSucursal },
                id_transportista: { type: db.sql.Int, value: idTransportista },
                placa: { type: db.sql.NVarChar(20), value: placa },
                descripcion: { type: db.sql.NVarChar(200), value: desc || null },
                marca: { type: db.sql.NVarChar(100), value: marca || null },
                modelo: { type: db.sql.NVarChar(100), value: modelo || null },
                anio: { type: db.sql.Int, value: anio },
                color: { type: db.sql.NVarChar(50), value: color || null },
                tipo_vehiculo: { type: db.sql.NVarChar(50), value: tipoVehiculo || null },
                capacidad: { type: db.sql.Decimal(10,2), value: capacidad },
                num_ejes: { type: db.sql.Int, value: numEjes },
                estado: { type: db.sql.Bit, value: estado }
            }
        );
        res.json({ ok: true, mensaje: 'Vehículo creado', data: { id_vehiculo: result[0].id } });
    } catch (error) {
        console.error('[VEHICULOS] Error al crear:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al crear vehículo' });
    }
});

router.put('/vehiculos/: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 placa = (req.body.placa || '').toString().trim().toUpperCase();
        var desc = (req.body.descripcion || '').toString().trim().toUpperCase();
        var marca = (req.body.marca || '').toString().trim().toUpperCase();
        var modelo = (req.body.modelo || '').toString().trim().toUpperCase();
        var color = (req.body.color || '').toString().trim().toUpperCase();
        var tipoVehiculo = (req.body.tipo_vehiculo || '').toString().trim().toUpperCase();
        var anio = req.body.anio ? parseInt(req.body.anio) : null;
        var capacidad = req.body.capacidad_toneladas ? parseFloat(req.body.capacidad_toneladas) : null;
        var numEjes = req.body.numero_ejes ? parseInt(req.body.numero_ejes) : null;
        var idTransportista = req.body.id_transportista ? parseInt(req.body.id_transportista) : null;
        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 (!placa) { return res.status(400).json({ ok: false, mensaje: 'La placa es requerida' }); }

        var dup = await db.query('SELECT COUNT(*) as cnt FROM vehiculos WHERE placa = @placa AND id_empresa = @emp AND id_vehiculo != @id', {
            placa: { type: db.sql.NVarChar(20), value: placa },
            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: 'La placa ya existe para esta empresa' });
        }

        await db.execute(
            'UPDATE vehiculos SET id_transportista = @id_transportista, placa = @placa, descripcion = @descripcion, marca = @marca, modelo = @modelo, anio = @anio, color = @color, tipo_vehiculo = @tipo_vehiculo, capacidad_toneladas = @capacidad, numero_ejes = @num_ejes, estado = @estado, id_sucursal = @id_sucursal WHERE id_vehiculo = @id AND id_empresa = @id_empresa',
            {
                id_transportista: { type: db.sql.Int, value: idTransportista },
                placa: { type: db.sql.NVarChar(20), value: placa },
                descripcion: { type: db.sql.NVarChar(200), value: desc || null },
                marca: { type: db.sql.NVarChar(100), value: marca || null },
                modelo: { type: db.sql.NVarChar(100), value: modelo || null },
                anio: { type: db.sql.Int, value: anio },
                color: { type: db.sql.NVarChar(50), value: color || null },
                tipo_vehiculo: { type: db.sql.NVarChar(50), value: tipoVehiculo || null },
                capacidad: { type: db.sql.Decimal(10,2), value: capacidad },
                num_ejes: { type: db.sql.Int, value: numEjes },
                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: 'Vehículo actualizado' });
    } catch (error) {
        console.error('[VEHICULOS] Error al actualizar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al actualizar vehículo' });
    }
});

router.delete('/vehiculos/: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' });
        }
        await db.execute('UPDATE vehiculos SET estado = 0 WHERE id_vehiculo = @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: 'Vehículo desactivado' });
    } catch (error) {
        console.error('[VEHICULOS] Error al desactivar:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al desactivar vehículo' });
    }
});

router.get('/vehiculos-transportista', 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 idTransportista = parseInt(req.query.id_transportista);
        var rows = await db.query('SELECT id_vehiculo, placa, marca, modelo FROM vehiculos WHERE id_empresa = @id_empresa AND id_transportista = @id AND estado = 1 ORDER BY placa', {
            id_empresa: { type: db.sql.Int, value: idEmpresa },
            id: { type: db.sql.Int, value: idTransportista }
        });
        res.json({ ok: true, data: rows });
    } catch (error) {
        console.error('[VEHICULOS] Error al listar por transportista:', error.message);
        res.status(500).json({ ok: false, mensaje: 'Error al consultar vehículos' });
    }
});

module.exports = router;
