package NatsServer

import (
	"ColdVerify_server/lib"
	"ColdVerify_server/logs"
	"errors"
	"github.com/vmihailenco/msgpack/v5"
	"time"
)


type Device struct {
	T_sn              string    // 设备序列号
	T_pid             int       // Account.Company 绑定公司
	T_devName         string    // 设备名称  20字
	T_protocol        int       // 冷链通讯协议 1 :1.0协议   2 :2.0协议    3 :3.0协议
	T_mqttid          string    // MQTT 服务ID
	T_VerifyTime      time.Time // 验证时间
	T_CalibrationTime time.Time // 校准时间
	T_PatrolTime      time.Time // 巡检时间
	T_abandonTime     time.Time // 弃用时间
	T_ist             int       // 温度   1开启   2关闭
	T_ish             int       // 湿度   1开启   2关闭

	T_State int // 0 屏蔽   1 正常  （屏蔽后 只有内部管理员才能看到，用户 输入SN\名称 搜索时 也能看到）

	// 设备同步参数
	T_Dattery  int    // 电量
	T_Site     string // GPS
	T_monitor  int    // 监控状态 0 未监控 1 监控  停止记录
	T_online   int    // 在线状态 0 未启用  1 在线  2 离线
	T_online_s int    // 在线状态-备用  0 未启用  1 在线  2 离线

	// 硬件信息
	T_model string // KF200BG  设备型号
	T_sver  string // "1.0.0",//软件版本
	T_hver  string // "1.0.0",//硬件版本
	T_imei  string // "867387060327718",//模组imei
	T_iccid string // "89860477102170049750",//sim卡号
	T_rssi  string // "80",//信号强度

	CreateTime time.Time //auto_now_add 第一次保存时才设置时间
	UpdateTime time.Time //auto_now 每次 model 保存时都会对时间自动更新
}


func Cold_UpdateDevice_CalibrationTime(T_sn, T_CalibrationExpirationTime string) error {
	logs.Println("Nats =>", lib.FuncName(), T_sn, T_CalibrationExpirationTime)

	type T_Req struct {
		T_sn              string
		T_CalibrationTime string
	}
	t_r := T_Req{
		T_sn:              T_sn,
		T_CalibrationTime: T_CalibrationExpirationTime,
	}

	b, err := msgpack.Marshal(&t_r)
	if err != nil {
		logs.Error("Nats =>", "msgpack Marshal err", err)
		return err
	}

	msg, err := lib.Nats.Request("Cold_UpdateDevice_CalibrationTime", b, 3*time.Second)
	if err != nil {
		return err
	}

	type T_R struct {
		Code int16       `xml:"Code"`
		Msg  string      `xml:"Msg"`
		Data interface{} `xml:"Data"`
	}
	var t_R T_R

	err = msgpack.Unmarshal(msg.Data, &t_R)
	if err != nil {
		return err
	}
	if t_R.Code != 200 {
		return errors.New(t_R.Msg)
	}
	return nil
}

func Cold_ReadDeviceByT_sn(T_sn string) (data Device, err error) {

	msg, err := lib.Nats.Request("Cold_ReadDeviceByT_sn", []byte(T_sn), 3*time.Second)
	if err != nil {
		return
	}

	type T_R struct {
		Code int16  `xml:"Code"`
		Msg  string `xml:"Msg"`
		Data Device `xml:"Data"` // 泛型
	}
	var t_R T_R

	err = msgpack.Unmarshal(msg.Data, &t_R)
	if err != nil {
		return
	}
	if t_R.Code != 200 {
		err = errors.New(t_R.Msg)
		return
	}
	data = t_R.Data

	return data, nil
}
