package counter_util

import (
	"time"
)

// CounterUtil
// @description: 固定窗口计数器辅助类
type CounterUtil struct {
	tag                 string                                 // tag counter标识
	num                 int                                    // num 当前计数
	warnNum             int                                    // warnNum 警告数量
	windowsTime         time.Time                              // windowsTime 窗口时间
	checkSameWindowsFun func(t1, t2 time.Time) bool            // checkSameWindowsFun 比较是否同一个时间窗口
	warnAction          func(tag string, num int, t time.Time) // warnAction 监控回调方法
}

// NewCounterUtil
// @description: 构造计数器
// parameter:
//		@_tag:tag标识，会在WarnAction中传递回来
//		@_warnNum:告警数量
//		@_checkWindowFun:比较是否同一个时间窗口
//		@_warnAction:指定数量触发回调
// return:
//		@*CounterUtil:固定窗口计数器辅助类
func NewCounterUtil(_tag string, _warnNum int, _checkWindowFun func(t1, t2 time.Time) bool, _warnAction func(tag string, num int, t time.Time)) *CounterUtil {
	r := &CounterUtil{
		tag:                 _tag,
		warnNum:             _warnNum,
		windowsTime:         time.Now(),
		checkSameWindowsFun: _checkWindowFun,
		warnAction:          _warnAction,
	}

	return r
}

// AddNum
// @description: 添加数量
// parameter:
//		@receiver c:计数器
//		@n:增加的数量
// return:
//		@int:计数器当前的数量
func (c *CounterUtil) AddNum(n int) int {
	if !c.checkSameWindowsFun(c.windowsTime, time.Now()) {
		c.num = 0
		c.windowsTime = time.Now()
	}

	//  增加次数
	c.num += n
	if c.num >= c.warnNum {
		c.warnAction(c.tag, c.num, time.Now())
		c.num = 0
	}

	return c.num
}
