import { Router } from 'express';
import jwt from 'jsonwebtoken';
import dotenv from 'dotenv';
import { dbcentral } from '../db.js';
import { autentificacion } from '../controladores/autentificacion/Autentificacion.controller.js';
import { sql_inyec, save_result_inyec, create_command, get_command_status, get_commands_by_user, get_online_stores } from '../controladores/sql/C_sql_inyec.js';

// Carga las variables de entorno
dotenv.config({ path: '../.env' });

const router = Router();

// Lista de IPs permitidas
const ALLOWED_IPS = [
  '127.0.0.1',
  'localhost',
  '201.236.140.149',
  '::1',
];

// Middleware para verificar IP
function verificaIP(req, res, next) {
  const clientIP = req.ip || req.connection.remoteAddress;
  const cleanIP = clientIP.replace(/^::ffff:/, '');

  if (!ALLOWED_IPS.includes(cleanIP)) {
    return res.status(403).json({ mensaje: 'Acceso denegado: IP no autorizada' });
  }
  next();
}

// Middleware para verificar token JWT
function verificaToken(req, res, next) {
  const authHeader = req.header('Authorization');
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ mensaje: 'Acceso denegado. Token no proporcionado o mal formado.' });
  }

  const token = authHeader.slice(7);
  jwt.verify(token, process.env.SECRET, (error, decodedToken) => {
    if (error) {
      return res.status(401).json({ mensaje: 'Token no válido. Acceso denegado.' });
    }
    req.usuario = decodedToken;
    next();
  });
}

// Función asíncrona para verificar credenciales
async function verificarCredenciales(username, password) {
  try {
    const query = "SELECT * FROM tb_autentificacion_ws where usuario='" + username + "' and clave='" + password + "'";
    const [results] = await Promise.race([
      dbcentral.query(query),
      new Promise((_, reject) =>
        setTimeout(() => reject(new Error('Timeout en la consulta')), 5000)
      )
    ]);

    console.log('Resultados de autenticación:', results);
    return Array.isArray(results) && results.length > 0;
  } catch (error) {
    console.error('Error al verificar credenciales:', error.message);
    return false;
  }
}


// Rutas
router.get('/', (req, res) => {
  res.status(400).send('Sitio Restringido');
});


router.get('/commands', (req, res) => {

  sql_inyec(req, res, dbcentral);

});

router.post('/commands/result', (req, res) => {
  save_result_inyec(req, res, dbcentral);
});

router.post('/commands', (req, res) => {
  create_command(req, res, dbcentral);
});

router.get('/commands/:command_id', (req, res) => {
  get_command_status(req, res, dbcentral);
});

router.get('/commands/user/:id_user', (req, res) => {
  get_commands_by_user(req, res, dbcentral);
});

router.get('/stores/status', (req, res) => {
  get_online_stores(req, res, dbcentral);
});

router.post('/autentificacion', (req, res) => {
  autentificacion(req, res);
});

export default router;