const { checkRateLimit } = require('./db');

const LIMITS = {
  ip:      { max: 20, window: 300  },   // 20 req / 5 min
  user:    { max: 5,  window: 600  },   // 5 failures / 10 min lock
  hwid:    { max: 10, window: 900  }    // 10 failures / 15 min lock
};

/**
 * Check all three rate limit dimensions.
 * Returns { allowed, retryAfter } — retryAfter is the longest among triggered limits.
 */
function checkLoginRateLimit(ip, username, hwidCombined) {
  let maxRetryAfter = 0;

  // IP-based
  const ipLimit = checkRateLimit(`ip:${ip}`, 'login', LIMITS.ip.max, LIMITS.ip.window);
  if (!ipLimit.allowed) {
    maxRetryAfter = Math.max(maxRetryAfter, ipLimit.retryAfter);
  }

  // Username-based (only for failed attempts — counted in login handler)
  const userLimit = checkRateLimit(`user:${username}`, 'login', LIMITS.user.max, LIMITS.user.window);
  if (!userLimit.allowed) {
    maxRetryAfter = Math.max(maxRetryAfter, userLimit.retryAfter);
  }

  // HWID-based
  if (hwidCombined) {
    const hwidLimit = checkRateLimit(`hwid:${hwidCombined}`, 'login', LIMITS.hwid.max, LIMITS.hwid.window);
    if (!hwidLimit.allowed) {
      maxRetryAfter = Math.max(maxRetryAfter, hwidLimit.retryAfter);
    }
  }

  return {
    allowed: maxRetryAfter === 0,
    retryAfter: maxRetryAfter
  };
}

module.exports = { checkLoginRateLimit };
