// src/routes/usuarioRoles.routes.js
const express = require('express');
const router = express.Router();
const pool = require('../config/db');
const { requireAuth} = require('../utils/jwt');
const requireAdmin = require('../middleware/requireAdmin');
const { body } = require('express-validator');
const handleValidation = require('../middleware/handleValidation');

// ✅ Validaciones de entrada
const validateBody = [
  body('id_usuario').isInt({ min: 1 }).withMessage('id_usuario inválido'),
  body('id_rol').isInt({ min: 1 }).withMessage('id_rol inválido'),
];

// ⚠️ Protegido: solo un admin puede asignar roles
// (si aún no tienes un admin, asigna uno con el SQL temporal del paso 4)
router.post('/',
  requireAuth,
  requireAdmin(),
  validateBody,
  handleValidation,
  async (req, res, next) => {
    const { id_usuario, id_rol } = req.body;
    try {
      // 1) Verifica que el usuario exista y esté activo
      const [u] = await pool.query(
        `SELECT id_usuario, activo FROM usuarios WHERE id_usuario = ? LIMIT 1`,
        [id_usuario]
      );
      if (!u.length) return res.status(404).json({ error: 'Usuario no existe' });
      if (u[0].activo !== 1) return res.status(400).json({ error: 'Usuario inactivo' });

      // 2) Verifica que el rol exista
      const [r] = await pool.query(
        `SELECT id_rol, nombre FROM roles WHERE id_rol = ? LIMIT 1`,
        [id_rol]
      );
      if (!r.length) return res.status(404).json({ error: 'Rol no existe' });

      // 3) Verifica duplicado
      const [dupe] = await pool.query(
        `SELECT 1 FROM usuarios_roles WHERE id_usuario=? AND id_rol=? LIMIT 1`,
        [id_usuario, id_rol]
      );
      if (dupe.length) return res.status(409).json({ error: 'El usuario ya tiene ese rol' });

      // 4) Inserta
      const [ins] = await pool.query(
        `INSERT INTO usuarios_roles (id_usuario, id_rol) VALUES (?, ?)`,
        [id_usuario, id_rol]
      );

      // 5) Devuelve confirmación
      res.status(201).json({
        ok: true,
        id_usuario,
        id_rol,
        insertId: ins.insertId
      });
    } catch (err) {
      console.error('ERROR /api/usuario-roles:', err);
      // ER_NO_REFERENCED_ROW, ER_DUP_ENTRY, etc.
      return next(err);
    }
  }
);

// (Opcional) obtener roles de un usuario
router.get('/:id_usuario', requireAuth, requireAdmin(), async (req, res, next) => {
  try {
    const id_usuario = +req.params.id_usuario;
    const [rows] = await pool.query(
      `SELECT ur.id_usuario, ur.id_rol, r.nombre AS rol
       FROM usuarios_roles ur
       JOIN roles r ON r.id_rol = ur.id_rol
       WHERE ur.id_usuario = ?`,
      [id_usuario]
    );
    res.json(rows);
  } catch (err) { next(err); }
});

module.exports = router;
