package et_Info

import (
	"gitea.anxinyun.cn/container/common_models"
	"gitea.anxinyun.cn/container/common_utils"
	"gitea.anxinyun.cn/container/common_utils/configLoad"
	"log"
	"node/stages"
)

type InfoHandler struct {
	configHelper *common_utils.ConfigHelper
	stage        *stages.Stage
}

func NewInfoHandler() *InfoHandler {
	redisAddr := configLoad.LoadConfig().GetString("redis.address")
	the := &InfoHandler{
		configHelper: common_utils.NewConfigHelper(redisAddr),
		stage:        stages.NewStage("测点信息获取"),
	}
	the.stage.AddProcess(the.getStationInfo)
	return the
}

func (the *InfoHandler) GetStage() stages.Stage {
	return *the.stage
}

func (the *InfoHandler) getStationInfo(p *common_models.ProcessData) *common_models.ProcessData {

	s, err := the.configHelper.GetDeviceStationObjs(p.DeviceData.DeviceId)
	if err == nil && s != nil {
		p.Stations = s
	} else {
		//无法查询到完整的 重新获取
		log.Printf("重获取设备[%s]的 DeviceStationObj", p.DeviceData.DeviceId)
		stationIds, err := the.configHelper.GetDeviceStationIds(p.DeviceData.DeviceId)
		if err != nil {
			log.Printf("err !!!  GetDeviceStationIds =>%s", err.Error())
			return p
		}
		p.Stations, err = the.configHelper.GetStations(stationIds...)
		the.getFormulaInfo(p)
		//补全 设备数据输入单位
		p.DeviceData.RawUnit = p.DeviceData.DeviceInfo.DeviceMeta.GetOutputUnit()
		//存储测点obj
		if len(p.Stations) > 0 {
			the.configHelper.SetDeviceStationObjs(p.DeviceData.DeviceId, p.Stations)
		}
	}
	return p
}

func (the *InfoHandler) getFormulaInfo(p *common_models.ProcessData) {
	for i, _ := range p.Stations {
		deviceFactorProto, err := the.configHelper.GetDeviceFactorProto(p.Stations[i].Info.ProtoCode, p.DeviceData.DeviceInfo.DeviceMeta.Id)
		p.Stations[i].Info.Proto, err = the.configHelper.GetProto(p.Stations[i].Info.ProtoCode)
		if err != nil {
			panic(err)
		}
		//绑定工具没有配置 设备和监测原型,字段映射关系的
		if len(deviceFactorProto.FieldVal) == 0 {
			log.Printf("设备[%s]和原型[%s]无绑定关系,默认采用监测原型字段", p.DeviceData.DeviceId, p.Stations[i].Info.ProtoCode)
			deviceFactorProto.FieldVal = the.defaultDeviceFactorProtoFieldVal(p.Stations[i].Info.Proto)
		}
		for i2, device := range p.Stations[i].Info.Devices {
			formulaInfo, err := the.configHelper.GetFormulaInfo(device.FormulaId)
			if err == nil {
				p.Stations[i].Info.Devices[i2].FormulaInfo = formulaInfo
				p.Stations[i].Info.Devices[i2].DeviceFactorProto = deviceFactorProto
			}

		}

	}
}

func (the *InfoHandler) defaultDeviceFactorProtoFieldVal(p common_models.Proto) map[string]string {
	fieldMap := make(map[string]string)
	for _, item := range p.Items {
		fieldMap[item.FieldName] = item.FieldName
	}
	return fieldMap
}