package middleware

import "sync"

// RateLimiter 双维度滑动窗口登录限流
// 维度一（账户）：同邮箱 1 分钟内失败 3 次 → 锁定 1 分钟
// 维度二（IP）：同 IP 1 分钟内失败 10 次 → 锁定 1 分钟
type RateLimiter struct {
	mu              sync.RWMutex
	accountFailures map[string]*windowState
	ipFailures      map[string]*windowState
}

// NewRateLimiter 创建限流器并启动后台清理
func NewRateLimiter() *RateLimiter {
	rl := &RateLimiter{
		accountFailures: make(map[string]*windowState),
		ipFailures:      make(map[string]*windowState),
	}
	go rl.cleanupLoop()
	return rl
}

// AllowAccount 检查账户维度是否允许登录尝试
func (rl *RateLimiter) AllowAccount(email string) (RateLimitResult, func()) {
	return rl.check(rl.accountFailures, email, accountWindow, accountBlockDur, accountMaxFails, true)
}

// AllowIP 检查 IP 维度是否允许登录尝试
func (rl *RateLimiter) AllowIP(ip string) (RateLimitResult, func()) {
	return rl.check(rl.ipFailures, ip, ipWindow, ipBlockDur, ipMaxFails, false)
}
