import rateLimit, { ipKeyGenerator } from "express-rate-limit";


export const loginLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 15, // 5 requests per window
    message: "Too many login attempts. Please try again after 15 minutes",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});

export const otpRequestLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, 
    max: 5, 
    message: "Too many OTP requests. Please try again after 15 minutes",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const otpVerifyLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, 
    max: 5, 
    message: "Too many OTP verification attempts. Please try again after 15 minutes",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const transactionLimiter = rateLimit({
    windowMs: 60 * 60 * 1000, 
    max: 10,
    message: "Too many transaction requests. Please try again after 1 hour",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const fileUploadLimiter = rateLimit({
    windowMs: 60 * 60 * 1000, 
    max: 20,
    message: "Too many file upload requests. Please try again after 1 hour",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const generalLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, 
    max: 100, 
    message: "Too many requests. Please try again later",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const registrationLimiter = rateLimit({
    windowMs: 60 * 60 * 1000, 
    max: 50, 
    message: "Too many registration attempts. Please try again after 1 hour",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});

export const tokenRefreshLimiter = rateLimit({
    windowMs: 60 * 60 * 1000, 
    max: 20, 
    message: "Too many token refresh requests. Please try again after 1 hour",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const adminOperationLimiter = rateLimit({
    windowMs: 60 * 60 * 1000, 
    max: 50, 
    message: "Too many admin operation requests. Please try again after 1 hour",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const contentManagementLimiter = rateLimit({
    windowMs: 60 * 60 * 1000, 
    max: 100, 
    message: "Too many content management requests. Please try again after 1 hour",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});


export const readOperationLimiter = rateLimit({
    windowMs: 60 * 60 * 1000, 
    max: 300, 
    message: "Too many read requests. Please try again after 1 hour",
    standardHeaders: true,
    legacyHeaders: false,
    keyGenerator: (req) => `${ipKeyGenerator(req.ip ?? 'unknown')}:${req.path}`,
});
