package nats_server

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
	"time"
)

type JsonTime struct {
	time.Time
}

func (t JsonTime) MarshalJSON() ([]byte, error) {
	str := fmt.Sprintf("\"%s\"", t.Format("2006-01-02 15:04:05"))
	return []byte(str), nil
}

func (t JsonTime) Value() (driver.Value, error) {
	var zeroTime time.Time
	if t.Time.UnixNano() == zeroTime.UnixNano() {
		return nil, nil
	}
	return t.Time, nil
}

func (t *JsonTime) Scan(v interface{}) error {
	value, ok := v.(time.Time)
	if ok {
		*t = JsonTime{Time: value}
		return nil
	}
	return fmt.Errorf("error %v", v)
}

type DeviceSensor_R struct {
	T_sn   string // 设备序列号 KF开头，环境监测主机。 YD开头，温途监测主机
	T_id   int    // 传感器编号
	T_name string // 标题

	//T_pid      int    // 公司id
	//T_pid_name string // 公司名称
	//
	//T_3dview   string // 3D 视图ID
	//T_sort     int    // 排序
	//T_Dattery  int    // 电量
	//T_Site     string // GPS
	//T_monitor  int    // 记录状态
	//T_online   int    // 在线状态 1 在线  0 离线
	//T_online_s int    // 在线状态-备用  0 未启用  1 在线  2 离线
	//T_datashow int    // 0 屏蔽数据展示  1 正常数据展示
	//T_type     int    // 类型
	//T_link     int    // 0:断开/故障 1连接 实时数据
	//T_State    int    // 0 屏蔽   1 正常  （屏蔽后 只有内部管理员才能看到，用户 输入SN\名称 搜索时 也能看到）

	T_DeviceSensorData      DeviceData_R2           // 传感器最新数据
	T_DeviceSensorParameter DeviceSensorParameter_R //  设备参数
}
type DeviceData_R2 struct {
	T_t    float32 // 温度
	T_rh   float32 // 湿度
	T_site string  // GPS
	T_time string  // 采集时间
}
type DeviceData_ struct {
	T_id   int       // 传感器id
	T_sp   int       // 传感器参数id
	T_t    float32   // 温度
	T_rh   float32   // 湿度
	T_site string    // GPS
	T_time time.Time // 采集时间
}

func (ab *DeviceData_) MarshalJSON() ([]byte, error) {
	loc, _ := time.LoadLocation("Asia/Shanghai")
	type Alias DeviceData_
	return json.Marshal(&struct {
		T_time string `json:"T_time,omitempty"`
		*Alias
	}{
		T_time: ab.T_time.In(loc).Format("2006-01-02 15:04:05"),
		Alias:  (*Alias)(ab),
	})
}

type DeviceSensor struct {
	Id   int    `orm:"column(ID);size(11);auto;pk"`
	T_sn string `orm:"index;size(256);null"` // 设备序列号 KF开头，环境监测主机。 YD开头，温途监测主机
	T_id int    `orm:"index;size(11);null"`  // 传感器编号
	T_sp int    `orm:"size(11);null"`        // 传感器参数id

	T_name string `orm:"size(256);null"` // 标题

	T_pid      int    `orm:"index;size(256);null"`     // Account.Company 绑定公司
	T_Class    string `orm:"size(256);null"`           // Device.DeviceClass.Id 设备分类  C1|C2|
	T_Notice   string `orm:"size(256);null"`           // 通知绑定
	T_datashow int    `orm:"size(2);default(1)"`       // 0 屏蔽数据展示  1 正常数据展示   （屏蔽后 数据展示无法看到，设备管理中 不受影响）
	T_sort     int    `orm:"size(200);default(1)"`     // 排序
	T_3dview   string `orm:"size(256);null"`           // 3D 视图ID
	T_type     int    `orm:"size(4);null"`             // Device.DeviceSensorType  1库房   2移动
	T_link     int    `orm:"size(4);default(1)"`       // 0:断开/故障 1连接 实时数据
	T_State    int    `orm:"index;size(2);default(1)"` // 0 屏蔽   1 正常  （屏蔽后 只有内部管理员才能看到，用户 输入SN\名称 搜索时 也能看到）

	// 设备同步参数
	T_Dattery  int    `orm:"size(4);null"`       // 电量
	T_Site     string `orm:"size(200);null"`     // GPS
	T_monitor  int    `orm:"size(2);null"`       // 监控状态 0 未监控 1 监控
	T_online   int    `orm:"size(2);default(1)"` // 在线状态 0 未启用  1 在线  2 离线
	T_online_s int    `orm:"size(2);default(0)"` // 在线状态-备用  0 未启用  1 在线  2 离线

	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
}

type DeviceData_R struct {
	T_sn   string  // sn
	T_id   int     // 传感器id
	T_name string  // 传感器名称
	T_t    float32 // 温度
	T_rh   float32 // 湿度
	T_site string  // GPS
	T_tl   float32 // 温度下限
	T_tu   float32 // 温度上限
	T_rhl  float32 // 湿度下限
	T_rhu  float32 // 湿度上限
	T_time string  // 采集时间
	//T_sp     int     // 传感器参数id
	//T_ist    int     // 温度   1开启   2关闭
	//T_ish    int     // 湿度   1开启   2关闭
	//T_remark string  // 备注
}

type DeviceSensorParameter_R struct {
	Id     int
	T_name string
	// 报警
	T_Tlower  float32 //  温度下限
	T_Tupper  float32 //  温度上限
	T_RHlower float32 //  湿度下限
	T_RHupper float32 //  湿度上限
	// 预警
	//T_enprel     int     // 是否启用预警
	//T_tprel      float32 //  温度预警下限
	//T_tpreu      float32 //  温度预警上限
	//T_hprel      float32 //  湿度预警下限
	//T_hpreu      float32 //  温度预警上限
	//T_enprelnote int     // 预警记录数据

	//T_speed int // 传感器采样率   s(1~240) 默认：15 *
	//T_sense int // 传感器灵敏度   s(0~10) 默认：5
	//T_en   int // en:是否启用传感器，
	//T_free int // free：监测点是否为闲置状态（空库，只监测不报警）

	T_time JsonTime
}

type Device_R struct {
	T_sn              string // 设备序列号 KF开头，环境监测主机。 YD开头，温途监测主机
	T_devName         string // 设备名称
	T_protocol        int    // 1 1.0协议  2 2.0协议
	T_VerifyTime      string // 验证时间
	T_CalibrationTime string // 校准时间
	T_PatrolTime      string // 巡检时间
	T_ist             int    // 温度   1开启   2关闭
	T_ish             int    // 湿度   1开启   2关闭
	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_State           int    // 0 屏蔽   1 正常
	// 硬件信息
	T_model           string // KF200BG  产品型号
	T_ProductTypeName string // 验证工具LoRa  产品统称 + 类型
	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        string //auto_now_add 第一次保存时才设置时间
	UpdateTime        string //auto_now 每次 model 保存时都会对时间自动更新

	T_DeviceSensor_Num int // 传感器数量

}

type Company_R struct {
	Id         int
	T_mid      int     // 上一级 ID
	T_name     string  // 公司名称
	T_plan     string  // 平面图
	T_data     string  // 大数据
	T_v3d      string  // 3D 视图
	T_money    float32 // 余额
	T_warning  int     // 报警统计
	T_key      string
	T_type     int // 公司类型 1-医药公司 2-运输企业
	T_Charging int
	Children   []Company_R
}

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 保存时都会对时间自动更新
}

// 设备任务
type DeviceTask struct {
	Id         int       `orm:"column(ID);size(11);auto;pk"`
	T_sn       string    `orm:"size(256);null"`        // 设备序列号 KF开头，环境监测主机。 YD开头，温途监测主机
	T_Ut_start time.Time `orm:"type(timestamp);null;"` // 采集时间
	T_Ut_end   time.Time `orm:"type(timestamp);null;"` // 采集时间

	T_Ut    time.Time `orm:"type(timestamp);null;"` // 采集时间
	T_State int       `orm:"size(2);default(1)"`
	//  1   start:开始监测任务，
	//  2   stop：结束监测任务，
	//  3   print：中途打印任务
}
