const rateLimit = require('express-rate-limit');
const RedisStore = require('rate-limit-redis');
const logger = require('../utils/logger');

// Rate limiter general para toda la API
const generalLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 1000, // Límite de 100 requests por ventana
  message: {
    success: false,
    message: 'Demasiadas peticiones desde esta IP, por favor intente más tarde.'
  },
  standardHeaders: true, // Retorna info de rate limit en headers `RateLimit-*`
  legacyHeaders: false, // Deshabilita headers `X-RateLimit-*`
  handler: (req, res) => {
    logger.warn(`Rate limit excedido para IP: ${req.ip} - Path: ${req.path}`);
    res.status(429).json({
      success: false,
      message: 'Demasiadas peticiones desde esta IP, por favor intente más tarde.',
      retryAfter: req.rateLimit.resetTime
    });
  },
  skip: (req) => {
    // Saltar rate limit para health check
    return req.path === '/health';
  }
});

// Rate limiter estricto para autenticación (prevenir fuerza bruta)
const authLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 5, // Solo 5 intentos de login por ventana
  skipSuccessfulRequests: true, // No contar requests exitosos
  message: {
    success: false,
    message: 'Demasiados intentos de inicio de sesión. Por favor intente más tarde.'
  },
  handler: (req, res) => {
    logger.warn(`Intentos de login excesivos desde IP: ${req.ip} - Email: ${req.body.email}`);
    res.status(429).json({
      success: false,
      message: 'Demasiados intentos de inicio de sesión. Por favor intente más tarde.',
      retryAfter: req.rateLimit.resetTime
    });
  }
});

// Rate limiter para creación de recursos (prevenir spam)
const createLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1 hora
  max: 500, // 50 creaciones por hora
  message: {
    success: false,
    message: 'Límite de creación de recursos alcanzado. Intente más tarde.'
  },
  handler: (req, res) => {
    logger.warn(`Límite de creación excedido para IP: ${req.ip} - Path: ${req.path}`);
    res.status(429).json({
      success: false,
      message: 'Límite de creación de recursos alcanzado. Intente más tarde.',
      retryAfter: req.rateLimit.resetTime
    });
  }
});

// Rate limiter para búsquedas (prevenir scraping)
const searchLimiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1 minuto
  max: 300, // 30 búsquedas por minuto
  message: {
    success: false,
    message: 'Demasiadas búsquedas. Por favor espere un momento.'
  },
  handler: (req, res) => {
    logger.warn(`Límite de búsqueda excedido para IP: ${req.ip} - Query: ${req.query.search || req.query.q}`);
    res.status(429).json({
      success: false,
      message: 'Demasiadas búsquedas. Por favor espere un momento.',
      retryAfter: req.rateLimit.resetTime
    });
  }
});

// Rate limiter para cambio de contraseña
const passwordChangeLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1 hora
  max: 30, // Solo 3 cambios de contraseña por hora
  message: {
    success: false,
    message: 'Demasiados intentos de cambio de contraseña. Intente más tarde.'
  },
  handler: (req, res) => {
    logger.warn(`Límite de cambio de contraseña excedido para usuario: ${req.user?.id}`);
    res.status(429).json({
      success: false,
      message: 'Demasiados intentos de cambio de contraseña. Intente más tarde.',
      retryAfter: req.rateLimit.resetTime
    });
  }
});

// Rate limiter para endpoints de administración
const adminLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 2000, // 200 requests por ventana para admins
  message: {
    success: false,
    message: 'Límite de peticiones alcanzado.'
  }
});

module.exports = {
  generalLimiter,
  authLimiter,
  createLimiter,
  searchLimiter,
  passwordChangeLimiter,
  adminLimiter
};