const jwt = require('jsonwebtoken');

const SECRET = process.env.JWT_SECRET || 'hackathon_celaya_2026_secret_key';

/**
 * Middleware que verifica el JWT en el header Authorization.
 * Si es válido, adjunta req.user = { userId, routeId, rol, domicilioId }
 */
function verificarToken(req, res, next) {
  const header = req.headers['authorization'];

  if (!header || !header.startsWith('Bearer ')) {
    return res.status(401).json({ error: 'Token requerido' });
  }

  const token = header.split(' ')[1];

  try {
    const payload = jwt.verify(token, SECRET);
    req.user = payload;
    next();
  } catch (err) {
    return res.status(401).json({ error: 'Token inválido o expirado' });
  }
}

/**
 * Middleware RBAC: solo permite el rol indicado.
 * Uso: router.get('/ruta', verificarToken, soloRol('admin'), handler)
 */
function soloRol(rol) {
  return (req, res, next) => {
    if (req.user?.rol !== rol) {
      return res.status(403).json({ error: 'Acceso denegado' });
    }
    next();
  };
}

/**
 * Middleware RBAC: valida que el domicilio consultado pertenece al usuario
 * que hace la petición. Protege contra "snooping" de rutas ajenas.
 * El endpoint debe recibir :domicilioId en los params.
 */
function soloMiDomicilio(req, res, next) {
  const { domicilioId } = req.params;
  if (domicilioId && domicilioId !== req.user?.domicilioId) {
    return res.status(403).json({ error: 'No puedes consultar domicilios ajenos' });
  }
  next();
}

module.exports = { verificarToken, soloRol, soloMiDomicilio };
