package handler

import (
	"cicv-data-closedloop/amd64/score_server/dao/mapper"
	"cicv-data-closedloop/common/config/c_log"
	commonEntity "cicv-data-closedloop/common/entity"
	"cicv-data-closedloop/common/util"
	"github.com/gin-gonic/gin"
	"net/http"
	"sync"
)

type CollectLimitPao struct {
	SnCode            string ` json:"snCode"`            // 机器人sn码
	CollectLimitDay   string ` json:"collectLimitDay"`   // 机器人配置的每日限额采集数
	CollectLimitWeek  string ` json:"collectLimitWeek"`  // 机器人配置的每周限额采集数
	CollectLimitMonth string ` json:"collectLimitMonth"` // 机器人配置的每月限额采集数
	CollectLimitYear  string ` json:"collectLimitYear"`  // 机器人配置的每年限额采集数
}

var globalMutex sync.Mutex

// 接收设备数据采集触发信号，判断是否允许设备继续采集，如果允许返回允许信号（code为200），否则为拒绝采集
func TriggerCollect(c *gin.Context) {
	globalMutex.Lock()
	defer globalMutex.Unlock()
	param := new(CollectLimitPao)
	// 映射到结构体
	if err := c.ShouldBindJSON(&param); err != nil {
		c_log.GlobalLogger.Error("接收请求参数报错：", err)
		c.JSON(http.StatusBadRequest, commonEntity.Response{Code: 500, Msg: "请求体解析失败。"})
		return
	}
	c_log.GlobalLogger.Info("请求体为：", param)
	// 1 根据sn码查询当前设备已采集的包数量
	collectLimitPo := mapper.SelectFromCollectLimitBySnCode(param.SnCode)
	c_log.GlobalLogger.Info("数据库记录为：", collectLimitPo)
	// 2 将查出的数据与参数中的限额数进行对比，判断是否允许采集，如果允许，则返回 code 200
	if util.StringToInt(collectLimitPo.YearCollectedNumber) < util.StringToInt(param.CollectLimitYear) {
		if util.StringToInt(collectLimitPo.MonthCollectedNumber) < util.StringToInt(param.CollectLimitMonth) {
			if util.StringToInt(collectLimitPo.WeekCollectedNumber) < util.StringToInt(param.CollectLimitWeek) {
				if util.StringToInt(collectLimitPo.DayCollectedNumber) < util.StringToInt(param.CollectLimitDay) {
					// 所有值添加一
					mapper.UpdateCollectLimit(param.SnCode)
					// 返回允许信号
					c_log.GlobalLogger.Info("允许采集。")
					c.JSON(http.StatusOK, commonEntity.Response{
						Code: 200,
						Msg:  "允许采集。",
					})
					return
				} else {
					c_log.GlobalLogger.Infof("超过日限额。【%v】>=【%v】", collectLimitPo.DayCollectedNumber, param.CollectLimitDay)
				}
			} else {
				c_log.GlobalLogger.Infof("超过周限额。【%v】>=【%v】", collectLimitPo.WeekCollectedNumber, param.CollectLimitWeek)
			}
		} else {
			c_log.GlobalLogger.Infof("超过月限额。【%v】>=【%v】", collectLimitPo.MonthCollectedNumber, param.CollectLimitMonth)
		}
	} else {
		c_log.GlobalLogger.Infof("超过年限额。【%v】>=【%v】", collectLimitPo.YearCollectedNumber, param.CollectLimitYear)
	}
	c.JSON(http.StatusOK, commonEntity.Response{
		Code: 400,
		Msg:  "不允许采集。",
	})
}
