import rateLimit from 'express-rate-limit';
import logger from '../utils/logger';

/**
 * Rate limiter específico para el endpoint de refresh token
 * Configuración agresiva para prevenir ataques de fuerza bruta y sobrecarga
 * 
 * Límites:
 * - 10 peticiones por minuto por IP
 * - Si se supera, bloquear por 5 minutos
 */
export const refreshTokenRateLimiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1 minuto
  max: 30, // Máximo 30 peticiones por ventana (más permisivo)
  message: {
    success: false,
    error: 'Demasiados intentos de refresh. Por favor, espera un momento antes de reintentar.',
  },
  standardHeaders: true,
  legacyHeaders: false,
  // Función personalizada para el skip (no limitar en desarrollo si lo deseas)
  skip: (req) => {
    // En desarrollo, desactivar el rate limiting para evitar problemas de desarrollo
    return process.env.NODE_ENV === 'development';
  },
  // Handler personalizado cuando se excede el límite
  handler: (req, res) => {
    logger.warn('🚫 Rate limit excedido en /api/auth/refresh', {
      ip: req.ip,
      userAgent: req.get('User-Agent'),
      origin: req.get('Origin'),
      referer: req.get('Referer'),
    });
    
    res.status(429).json({
      success: false,
      error: 'Demasiados intentos de refresh. Por favor, espera un momento antes de reintentar.',
      retryAfter: '1 minute',
    });
  },
  // Función para generar una key única por IP
  keyGenerator: (req) => {
    // Intentar obtener la IP real del header X-Forwarded-For (si está detrás de un proxy)
    const forwardedFor = req.get('X-Forwarded-For');
    if (forwardedFor) {
      // Tomar la primera IP de la lista (la IP real del cliente)
      const ips = forwardedFor.split(',').map(ip => ip.trim());
      return ips[0];
    }
    // Si no hay X-Forwarded-For, usar req.ip
    return req.ip || 'unknown';
  },
});

/**
 * Rate limiter para login
 * Previene ataques de fuerza bruta en el login
 * 
 * Límites:
 * - 5 intentos de login por 15 minutos por IP
 */
export const loginRateLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 10, // Maximum 10 login attempts (más permisivo)
  message: {
    success: false,
    error: 'Too many login attempts. Please try again later.',
  },
  standardHeaders: true,
  legacyHeaders: false,
  skip: (req) => {
    // No limitar en desarrollo para facilitar el desarrollo
    return process.env.NODE_ENV === 'development';
  },
  handler: (req, res) => {
    logger.warn('🚫 Rate limit excedido en /api/auth/login', {
      ip: req.ip,
      userAgent: req.get('User-Agent'),
      email: req.body?.email,
    });
    
    res.status(429).json({
      success: false,
      error: 'Too many login attempts. Please try again in 15 minutes.',
      retryAfter: '15 minutes',
    });
  },
  keyGenerator: (req) => {
    const forwardedFor = req.get('X-Forwarded-For');
    if (forwardedFor) {
      const ips = forwardedFor.split(',').map(ip => ip.trim());
      return ips[0];
    }
    return req.ip || 'unknown';
  },
});

/**
 * Rate limiter para registro
 * Previene spam de registros
 * 
 * Límites:
 * - 3 registros por hora por IP
 */
export const registerRateLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1 hora
  max: 3, // Maximum 3 registrations per hour
  message: {
    success: false,
    error: 'Too many registration attempts. Please try again later.',
  },
  standardHeaders: true,
  legacyHeaders: false,
  handler: (req, res) => {
    logger.warn('🚫 Rate limit excedido en /api/auth/register', {
      ip: req.ip,
      userAgent: req.get('User-Agent'),
      email: req.body?.email,
    });
    
    res.status(429).json({
      success: false,
      error: 'Demasiados intentos de registro. Por favor, intenta de nuevo en 1 hora.',
      retryAfter: '1 hour',
    });
  },
  keyGenerator: (req) => {
    const forwardedFor = req.get('X-Forwarded-For');
    if (forwardedFor) {
      const ips = forwardedFor.split(',').map(ip => ip.trim());
      return ips[0];
    }
    return req.ip || 'unknown';
  },
});

/**
 * Rate limiter general para todos los endpoints de autenticación
 * Capa adicional de protección
 * 
 * Límites:
 * - 20 peticiones por minuto por IP
 */
export const authGeneralRateLimiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1 minuto
  max: 50, // Maximum 50 requests per minute (más permisivo)
  message: {
    success: false,
    error: 'Too many authentication requests. Please reduce the frequency.',
  },
  standardHeaders: true,
  legacyHeaders: false,
  skip: (req) => {
    // No limitar en desarrollo para facilitar el desarrollo
    return process.env.NODE_ENV === 'development';
  },
  handler: (req, res) => {
    logger.warn('🚫 Rate limit general excedido en auth', {
      ip: req.ip,
      path: req.path,
      userAgent: req.get('User-Agent'),
    });
    
    res.status(429).json({
      success: false,
      error: 'Too many authentication requests. Please reduce the frequency.',
      retryAfter: '1 minute',
    });
  },
  keyGenerator: (req) => {
    const forwardedFor = req.get('X-Forwarded-For');
    if (forwardedFor) {
      const ips = forwardedFor.split(',').map(ip => ip.trim());
      return ips[0];
    }
    return req.ip || 'unknown';
  },
});

