package models

import (
	"Cold_Data/conf"
	"Cold_Data/logs"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego/cache"
	_ "github.com/astaxie/beego/cache/redis"
	"strconv"
	"time"
)

var redisCache_DeviceSensor cache.Cache

func init() {

	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
		"ColdDataV_Company", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
	logs.Println(config)
	var err error
	redisCache_DeviceSensor, err = cache.NewCache("redis", config)
	if err != nil || redisCache_DeviceSensor == nil {
		errMsg := "failed to init redis"
		logs.Println(errMsg, err)
		panic(any(errMsg))
	}

}

// ---------------- Redis -------------------
// Redis_Set(m.T_sn,m) // Redis 更新缓存
func Redis_DeviceSensor_Set(T_id int, r Company_Project) (err error) {
	key := strconv.Itoa(T_id)

	//json序列化
	str, err := json.Marshal(r)
	if err != nil {
		logs.PrintlnError("Redis_DeviceSensor_Set", err)
		return
	}

	err = redisCache_DeviceSensor.Put(key, str, 24*time.Hour)
	if err != nil {
		logs.Println("set key:", key, ",value:", str, err)
	}
	return
}
func Redis_DeviceSensor_Get(key string) (r Company_Project, is bool) {
	if redisCache_DeviceSensor.IsExist(key) {
		//println("找到key:",key)
		v := redisCache_DeviceSensor.Get(key)
		json.Unmarshal(v.([]byte), &r)
		return r, true
	}
	//println("没有 找到key:",key)
	return Company_Project{}, false
}

//////////////////////////

// 设备列表类
type DeviceList_Project struct {
	T_sn     string // 设备序列号 KF开头，环境监测主机。 YD开头，温途监测主机
	T_id     int    // 传感器编号
	T_name   string // 标题
	T_sort   int    // 排序
	T_3dview string //3D 视图ID
	T_type   int    // 0:未知类型   1库房   2移动
	T_link   int    // 0:断开/故障   1连接     ：实时数据
	// 实时数据
	T_t       float32 // 温度
	T_rh      float32 // 湿度
	T_Tlower  float32 //  温度下限
	T_Tupper  float32 //  温度上限
	T_RHlower float32 //  湿度下限
	T_RHupper float32 //  湿度上限
	T_time    string  // 采集时间
	// 设备同步参数
	T_Dattery  int    // 电量
	T_Site     string // GPS                         ：实时数据
	T_monitor  int    // 监控状态 0 未监控 1 监控       ：记录数据(=0)   下线(=0)
	T_online   int    // 在线状态 0 未启用  1 在线  2 离线    ：上下线
	T_online_s int    // 在线状态-备用  0 未启用  1 在线  2 离线   ：上下线

}

// 设备类
type Device_Project struct {
	T_库房总数   int
	T_移动总数   int
	T_移动离线总数 int
	T_移动监控总数 int
	//DeviceList []DeviceList_Project
}

// 报警类
type Warning_Project struct {
	//T_库房报警总数      int
	T_库房未处理总数    int
	T_库房设备报警数_今天 int
	T_库房报警设备数_今天 int
	//T_库房设备报警数_昨天  int
	//T_库房设备报警数_近7天 int
	//T_库房设备报警数_本月  int
	//T_库房设备报警数_上一月 int
	T_库房报警类型统计 map[string]int
	//T_库房报警设备数_近7天 map[string]int

	//T_移动警数总数      int
	T_移动未处理总数    int
	T_移动设备报警数_今天 int
	T_移动报警设备数_今天 int
	T_移动报警类型统计   map[string]int
	//T_移动设备报警数_昨天  int
	//T_移动设备报警数_近7天 int
	//T_移动设备报警数_本月  int
	//T_移动设备报警数_上一月 int

	//T_移动报警设备数_近7天 map[string]int
	T_报警设备数_近7天    map[string]int
	T_报警设备数_近30天   map[string]int
	T_报警设备数_近90天   map[string]int
	T_探头报警类型统计     map[string]int
	T_探头报警类型统计_30天 map[string]int
	T_探头报警类型统计_90天 map[string]int
}

// 任务类
type Task_Project struct {
	T_任务总数_今天 int
	//T_任务总数_昨天  int
	//T_任务总数_近7天 int
	//T_任务总数_本月  int
	//T_任务总数_上一月 int
	//T_任务总数_近一年 map[string]int
	T_任务总数_近7天 map[string]int

	T_任务设备数_今天 int
	//T_任务设备数_昨天  int
	//T_任务设备数_近7天 int
	//T_任务设备数_本月  int
	//T_任务设备数_上一月 int
}

// 公司类
type Company_Project struct {
	Company_name       string
	Company_key        string
	Company_plan       string
	Company_data       string
	Company_v3d        string
	Company_Address    string
	Company_coordinate string
	Device             Device_Project
	Warning            Warning_Project
	Task               Task_Project
	Children           []*Company_Project
}
