package main

import (
	"fmt"
	"time"
)

// 缓存MHT应用的最近一次聊天的结构体
type MHTChatCache struct {
	StatisticsCount int64                  `json:"statisticsCount"` // 意识流重置，统计次数清零
	ChatTime        int64                  `json:"chatTime"`
	LastChat        map[string]interface{} `from:"lastChat" json:"lastChat"`
}

//定义缓存
var MHTAppChatCache = make(map[string]*MHTChatCache)

// 关怀预警日志结构体
type CareAlertLog struct {
	ID              int
	UserID          string
	AppID           int
	OverIndexes     []string
	MeasurementTime time.Time
}

// 检查并记录关怀预警
func CheckAndLogCareAlert(userId string) error {
	cachedData := MHTAppChatCache[userId]
	if cachedData == nil {
		fmt.Println("No cache data available for user:", userId)
		return fmt.Errorf("No cache data available")
	}

	userAnalysis, ok := cachedData.LastChat["用户分析"].(map[string]interface{})
	if !ok {
		fmt.Println("Invalid user analysis data")
		return fmt.Errorf("Invalid user analysis data")
	}

	// 过度指标的连续计数和最后一次值
	overIndexCounts := make(map[string]int)
	lastValues := make(map[string]int)

	for key, value := range userAnalysis {
		// 检查类型并转换
		val, ok := value.(int)
		if !ok {
			continue
		}

		// 检查是否连续两次值不小于8
		if val >= 8 {
			if lastVal, exist := lastValues[key]; exist && lastVal >= 8 {
				overIndexCounts[key]++
			} else {
				overIndexCounts[key] = 1
			}
		} else {
			overIndexCounts[key] = 0
		}
		lastValues[key] = val
	}

	// 收集所有符合条件的过度指标
	var overIndexes []string
	for index, count := range overIndexCounts {
		if count >= 5 {
			overIndexes = append(overIndexes, index)
		}
	}

	if len(overIndexes) > 0 {
		// 记录到关怀预警日志表中
		logEntry := CareAlertLog{
			UserID:          userId,
			AppID:           6, // 假设AppID为被硬编码
			OverIndexes:     overIndexes,
			MeasurementTime: time.Now(),
		}
		SaveCareAlertLog(logEntry)
	}

	return nil
}

// SaveCareAlertLog 实现了将关怀预警日志保存到数据库的逻辑（代码需要根据实际数据库调整）
func SaveCareAlertLog(logEntry CareAlertLog) {
	// 这里简化为控制台输出，实际应用中应将其保存到数据库
	fmt.Printf("Saved Care Alert Log: %+v\n", logEntry)
}

func main() {
	// 假设某个用户的ID
	userId := "123456"
	err := CheckAndLogCareAlert(userId)
	if err != nil {
		fmt.Println("Error:", err)
	}
}
