// src/routes/roles.routes.js
const express = require('express');
const router = express.Router();

const pool = require('../config/db');
const handleValidation = require('../middleware/handleValidation');

const {
  createRoleValidator,
  updateRoleValidator,
  roleIdValidator,
} = require('../validators/roles.validators');

// ✅ Listar todos los roles
router.get('/', async (req, res) => {
  try {
    const [rows] = await pool.query('SELECT * FROM roles');
    res.json(rows);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Error al obtener roles' });
  }
});

// ✅ Obtener rol por id
router.get('/:id', roleIdValidator, handleValidation, async (req, res) => {
  try {
    const [rows] = await pool.query('SELECT * FROM roles WHERE id_rol = ?', [
      req.params.id,
    ]);
    if (!rows.length) return res.status(404).json({ error: 'Rol no encontrado' });
    res.json(rows[0]);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Error al obtener rol' });
  }
});

// ✅ Crear nuevo rol
router.post('/', createRoleValidator, handleValidation, async (req, res) => {
  const { nombre, descripcion } = req.body;
  try {
    const [result] = await pool.query(
      'INSERT INTO roles (nombre, descripcion) VALUES (?, ?)',
      [nombre, descripcion]
    );
    res.status(201).json({
      message: 'Rol creado',
      id: result.insertId,
    });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Error al crear rol' });
  }
});

// ✅ Actualizar rol
router.put('/:id', updateRoleValidator, handleValidation, async (req, res) => {
  const { nombre, descripcion } = req.body;
  try {
    const [result] = await pool.query(
      'UPDATE roles SET nombre = COALESCE(?, nombre), descripcion = COALESCE(?, descripcion) WHERE id_rol = ?',
      [nombre ?? null, descripcion ?? null, req.params.id]
    );
    if (result.affectedRows === 0)
      return res.status(404).json({ error: 'Rol no encontrado' });
    res.json({ message: 'Rol actualizado' });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Error al actualizar rol' });
  }
});

// ✅ Eliminar rol
router.delete('/:id', roleIdValidator, handleValidation, async (req, res) => {
  try {
    const [result] = await pool.query('DELETE FROM roles WHERE id_rol = ?', [
      req.params.id,
    ]);
    if (result.affectedRows === 0)
      return res.status(404).json({ error: 'Rol no encontrado' });
    res.json({ message: 'Rol eliminado' });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Error al eliminar rol' });
  }
});

module.exports = router;
