/**
 * ========================================
 * MIDDLEWARE: requireAdmin
 * ========================================
 *
 * Middleware que verifica si el usuario autenticado tiene rol de administrador.
 * Se usa en rutas que solo deben ser accesibles para admins.
 *
 * FLUJO DE EJECUCIÓN:
 * 1. Verifica que req.user exista (debe usarse DESPUÉS de requireAuth)
 * 2. Consulta la base de datos para verificar el rol del usuario
 * 3. Si es admin, continúa; si no, devuelve 403 Forbidden
 *
 * ORIGEN: Se importa en rutas administrativas
 * DESTINO: Si es admin, continúa a la ruta; si no, devuelve error 403
 *
 * EJEMPLO DE USO:
 *   const { requireAuth } = require('../utils/jwt');
 *   const requireAdmin = require('../middleware/requireAdmin');
 *
 *   // Primero requireAuth, luego requireAdmin
 *   router.get('/admin/users', requireAuth, requireAdmin(), async (req, res) => {
 *     // Solo admins pueden llegar aquí
 *   });
 *
 * CÓDIGOS DE ERROR:
 * - 401: Usuario no autenticado (falta req.user)
 * - 403: Usuario autenticado pero no es admin
 */

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

/**
 * ========================================
 * FUNCIÓN AUXILIAR: isAdminInDB
 * ========================================
 * Consulta la base de datos para verificar si un usuario es admin
 *
 * @param {Number} idUsuario - ID del usuario a verificar
 * @returns {Boolean} true si es admin, false si no
 *
 * CONSULTA SQL:
 * - Une la tabla usuarios_roles con roles
 * - Busca el rol del usuario específico
 * - Verifica si el nombre del rol es 'admin'
 */
async function isAdminInDB(idUsuario) {
  const [rows] = await pool.query(
    `SELECT r.nombre AS rol
     FROM usuarios_roles ur
     JOIN roles r ON r.id_rol = ur.id_rol
     WHERE ur.id_usuario = ?
     LIMIT 1`,
    [idUsuario]
  );
  // Retorna true solo si encontró un registro Y el rol es 'admin'
  return rows.length && rows[0].rol === 'admin';
}

/**
 * ========================================
 * MIDDLEWARE FACTORY: requireAdmin
 * ========================================
 * Retorna una función middleware que verifica permisos de admin
 *
 * @returns {Function} Middleware asíncrono
 */
module.exports = function requireAdmin() {
  return async (req, res, next) => {
    try {
      // 1. Verifica que el usuario esté autenticado
      // req.user debe existir (lo adjunta requireAuth)
      if (!req.user) {
        return res.status(401).json({ error: 'No autenticado' });
      }

      // 2. Consulta si el usuario es admin en la base de datos
      const ok = await isAdminInDB(req.user.id_usuario);

      // 3. Si no es admin, rechaza con 403 Forbidden
      if (!ok) {
        return res.status(403).json({ error: 'No autorizado (solo admin)' });
      }

      // 4. Si es admin, continúa a la ruta
      next();

    } catch (e) {
      // Pasa cualquier error al manejador de errores de Express
      next(e);
    }
  };
};
