package monitorNewMgr

import (
	"sync"
	"time"

	"goutil/stringUtil"
)

const (
	// CON_MONITOR_HISTORY_SIZE 历史监控信息保存数量
	CON_MONITOR_HISTORY_SIZE = 3

	// CON_MONITOR_HISTORY_VALID_SECONDS 历史监控信息有效的秒数
	CON_MONITOR_HISTORY_VALID_SECONDS = 30

	// CON_MONITOR_HISTORY_SIMILARITY_THERSHOLD 历史监控信息相似度的阈值
	CON_MONITOR_HISTORY_SIMILARITY_THERSHOLD = 0.9
)

var (
	monitorHistoryList  = make([]*MonitorHistory, 0, CON_MONITOR_HISTORY_SIZE)
	monitorHistoryMutex sync.Mutex
)

func checkSimilarity(monitorMessage string, timestamp int64) (valid bool) {
	//默认监控信息有效
	valid = true

	monitorHistoryMutex.Lock()
	defer monitorHistoryMutex.Unlock()

	// 从后往前(按时间从后往前)遍历，以便于可以及时退出
	for i := len(monitorHistoryList) - 1; i >= 0; i-- {
		item := monitorHistoryList[i]

		// 如果已经过期，则不用处理； 返回之前的状态即可（当前的已经过期，则之前的也一定已经过期）
		if time.Now().Unix()-item.Timestamp > CON_MONITOR_HISTORY_VALID_SECONDS {
			break
		}

		// 如果两个字符串的长度相差2倍，则无须继续判断，继续与下一条数据进行比较
		lenA, lenB := len(monitorMessage), len(item.MonitorMessage)
		if lenA > 2*lenB || lenB > 2*lenA {
			continue
		}

		// 判断两个字符串的相似度（如果相似度超过阈值，则此日志无效）
		_, similarity := stringUtil.Similarity(monitorMessage, item.MonitorMessage)
		if similarity >= CON_MONITOR_HISTORY_SIMILARITY_THERSHOLD {
			valid = false
			return // 直接返回，无需将当前日志添加到历史列表中，以提高性能
		}
	}

	// 将消息添加到历史消息列表中
	monitorHistoryList = append(monitorHistoryList, newMonitorHistory(monitorMessage, timestamp))
	if len(monitorHistoryList) > CON_MONITOR_HISTORY_SIZE {
		monitorHistoryList = monitorHistoryList[len(monitorHistoryList)-CON_MONITOR_HISTORY_SIZE:]
	}

	return
}
