package ratelimit

import (
	"github.com/redis/go-redis/v9"
	"go.uber.org/zap"

	"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/config"
)

// ProvideRateLimiter provides a rate limiter for dependency injection (registration endpoints)
func ProvideRateLimiter(redisClient *redis.Client, cfg *config.Config, logger *zap.Logger) RateLimiter {
	rateLimitConfig := Config{
		MaxRequests: cfg.RateLimit.RegistrationMaxRequests,
		Window:      cfg.RateLimit.RegistrationWindow,
		KeyPrefix:   "ratelimit:registration",
	}

	return NewRateLimiter(redisClient, rateLimitConfig, logger)
}

// ProvideGenericRateLimiter provides a rate limiter for generic CRUD endpoints (CWE-770)
// This is used for authenticated endpoints like tenant/user/site management, admin endpoints
// Strategy: User-based limiting (authenticated user ID from JWT)
func ProvideGenericRateLimiter(redisClient *redis.Client, cfg *config.Config, logger *zap.Logger) RateLimiter {
	rateLimitConfig := Config{
		MaxRequests: cfg.RateLimit.GenericMaxRequests,
		Window:      cfg.RateLimit.GenericWindow,
		KeyPrefix:   "ratelimit:generic",
	}

	return NewRateLimiter(redisClient, rateLimitConfig, logger)
}

// ProvidePluginAPIRateLimiter provides a rate limiter for WordPress plugin API endpoints (CWE-770)
// This is used for plugin endpoints that are core business/revenue endpoints
// Strategy: Site-based limiting (API key → site_id)
func ProvidePluginAPIRateLimiter(redisClient *redis.Client, cfg *config.Config, logger *zap.Logger) RateLimiter {
	rateLimitConfig := Config{
		MaxRequests: cfg.RateLimit.PluginAPIMaxRequests,
		Window:      cfg.RateLimit.PluginAPIWindow,
		KeyPrefix:   "ratelimit:plugin",
	}

	return NewRateLimiter(redisClient, rateLimitConfig, logger)
}
