import rateLimit from 'express-rate-limit';
import { RateLimitError } from '../../utils/errors.js';

/**
 * Rate limiter pre login endpoint
 * Max 5 pokusov za 15 minút
 */
export const loginRateLimiter = rateLimit({
  windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS) || 15 * 60 * 1000, // 15 minút
  max: parseInt(process.env.RATE_LIMIT_LOGIN_MAX) || 5,
  message: {
    success: false,
    error: {
      message: 'Príliš veľa prihlasovacích pokusov. Skúste znova o 15 minút.',
      statusCode: 429,
    },
  },
  standardHeaders: true,
  legacyHeaders: false,
  // Skip successful requests - len zlyhané pokusy sa počítajú
  skip: (req, res) => {
    // Ak je response success, nerátaj to do limitu
    return res.statusCode < 400;
  },
  handler: (req, res) => {
    res.status(429).json({
      success: false,
      error: {
        message: 'Príliš veľa prihlasovacích pokusov. Skúste znova o 15 minút.',
        statusCode: 429,
      },
    });
  },
});

/**
 * Rate limiter pre všeobecné API endpointy
 * Development: 1000 requestov za 15 minút (viac pre development)
 * Production: 100 requestov za 15 minút
 */
export const apiRateLimiter = rateLimit({
  windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS) || 15 * 60 * 1000,
  max: process.env.NODE_ENV === 'production'
    ? parseInt(process.env.RATE_LIMIT_MAX_REQUESTS) || 100
    : 1000, // Higher limit for development
  message: {
    success: false,
    error: {
      message: 'Príliš veľa požiadaviek. Skúste znova neskôr.',
      statusCode: 429,
    },
  },
  standardHeaders: true,
  legacyHeaders: false,
  handler: (req, res) => {
    res.status(429).json({
      success: false,
      error: {
        message: 'Príliš veľa požiadaviek. Skúste znova neskôr.',
        statusCode: 429,
      },
    });
  },
});

/**
 * Rate limiter pre citlivé operácie (password reset, email change, atď.)
 * Development: 50 pokusov za 15 minút
 * Production: 3 pokusy za 15 minút
 */
export const sensitiveOperationLimiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: process.env.NODE_ENV === 'production' ? 10 : 50,
  message: {
    success: false,
    error: {
      message: 'Príliš veľa pokusov. Skúste znova o 15 minút.',
      statusCode: 429,
    },
  },
  standardHeaders: true,
  legacyHeaders: false,
  handler: (req, res) => {
    res.status(429).json({
      success: false,
      error: {
        message: 'Príliš veľa pokusov. Skúste znova o 15 minút.',
        statusCode: 429,
      },
    });
  },
});
