/**
 * src/middleware/rateLimit.js — настройки ограничения частоты запросов.
 *
 * Зачем вынесено отдельно:
 *   - Лимиты можно менять в одном месте, не трогая роуты.
 *   - Легко подключать только нужный лимитер к конкретному роуту.
 *   - Упрощает тестирование — можно заменить на no-op лимитер в тестах.
 *
 * express-rate-limit считает запросы по IP (по умолчанию — req.ip).
 * Если приложение стоит за reverse-proxy (nginx/traefik), нужно
 * настроить app.set('trust proxy', 1) чтобы X-Forwarded-For работал корректно.
 */

'use strict';

const { rateLimit } = require('express-rate-limit');

// ── mutationLimiter — для мутирующих POST-запросов ────────────────────────────
// Применяется к: POST /add, /edit/:id, /delete/:id, /admin/limit/:id
//
// Лимит 30 запросов за минуту с одного IP — достаточно для ручного
// пользования и при этом блокирует простые скриптовые атаки.
//
// При превышении лимита — 429 Too Many Requests.
const mutationLimiter = rateLimit({
  windowMs: 60_000,          // скользящее окно: 1 минута
  limit: 30,                 // не более 30 POST-запросов за окно
  standardHeaders: 'draft-7', // добавляет заголовки RateLimit-* и Retry-After
  legacyHeaders: false,       // не добавлять устаревшие X-RateLimit-* заголовки
  message: { error: 'Слишком много запросов. Подождите минуту.' },
});

// ── exportLimiter — для GET /export ──────────────────────────────────────────
// 20 запросов в минуту достаточно для автоматической синхронизации
// (nginx/firewall обычно опрашивают раз в несколько минут).
const exportLimiter = rateLimit({
  windowMs: 60_000,
  limit: 20,
  standardHeaders: 'draft-7',
  legacyHeaders: false,
  message: 'Слишком много запросов к /export. Подождите минуту.',
});

// ── authLimiter — для POST /login, POST /dev-login, GET /callback ─────────────
// Защита от брутфорса и нагрузки на Keycloak token endpoint.
// 10 попыток в 5 минут с одного IP — достаточно для нормального пользования,
// жёстко блокирует автоматические переборы.
const authLimiter = rateLimit({
  windowMs: 5 * 60_000,      // скользящее окно: 5 минут
  limit: 10,                 // не более 10 попыток входа за окно
  standardHeaders: 'draft-7',
  legacyHeaders: false,
  message: { error: 'Слишком много попыток входа. Попробуйте через 5 минут.' },
});

module.exports = { mutationLimiter, exportLimiter, authLimiter };
