package dao

import (
	"gorm.io/gorm"
	"iot_manager_service/util/common"
	"time"
)

//Zigbee集控器
type Zigbee struct {
	ID               int         `gorm:"primary_key" json:"id"`                     //编号
	Name             string      `gorm:"type:varchar(64)" json:"name"`              //名称
	Sn               string      `gorm:"type:varchar(60)" json:"sn"`                //唯一编码
	GroupId          int         `gorm:"type:int" json:"groupId"`                   //所属灯杆分组id
	LampPoleId       int         `gorm:"type:int" json:"lampPoleId"`                //所属灯杆id
	LampPoleName     string      `gorm:"type: varchar(64)" json:"lampPoleName"`     //灯杆名称
	LampPoleSn       string      `gorm:"type: varchar(64)" json:"lampPoleSn"`       //灯杆编码
	LampPoleLocation string      `gorm:"type:varchar(255)" json:"lampPoleLocation"` //灯杆安装位置
	PoleLng          float64     `gorm:"type:double(17, 14)" json:"poleLng"`        //经度
	PoleLat          float64     `gorm:"type:double(17, 14)" json:"poleLat"`        //纬度
	BrandId          int         `gorm:"type:int" json:"brandId"`                   //设备名称
	ModelId          int         `gorm:"type:int" json:"modelId"`                   //设备型号
	GatewayId        int         `gorm:"type:int" json:"gatewayId"`                 //所属网关id
	GatewayName      string      `gorm:"type:varchar(64)" json:"gatewayName"`       //所属网关名称
	GatewaySn        string      `gorm:"type:varchar(60)" json:"gatewaySn"`         //所属网关编码
	ChannelNum       int         `gorm:"type:int" json:"chanelNum"`                 //通道号
	NetworkNum       int         `gorm:"type:int" json:"networkNum"`                //网络号
	InstallTime      common.Time `gorm:"type:date" json:"installTime"`              //安装时间
	TenantId         string      `gorm:"type:varchar(12)" json:"tenantId"`          //租户id
	CreateTime       time.Time   `gorm:"type:datetime" json:"createTime"`           //新增时间
	CreateUser       int64       `gorm:"type:bigint" json:"createUser"`             //新增记录操作用户ID
	UpdateTime       time.Time   `gorm:"type:datetime" json:"updateTime"`           //修改时间
	UpdateUser       int64       `gorm:"type:bigint" json:"updateUser"`             //修改用户
	IsDeleted        int         `gorm:"type:int;default 0" json:"isDeleted"`       //是否删除 0=未删除,1=删除
	Status           int         `gorm:"type:int" json:"status"`                    //状态0=正常 状态0=正常,1=异常
	Tag              string      `gorm:"type:varchar(255)" json:"tag"`              //标签，保留字段(逗号区分)
	IPAddress        string      `gorm:"type:varchar(64)" json:"ipAddress"`         //IP地址-备用

	CountRel int `gorm:"-;default 0" json:"countRel"` //关联终端数-暂无数据 先写个0
}

func (Zigbee) TableName() string {
	return "device_zigbee"
}

func (c Zigbee) Delete() error {
	return Db.Debug().Model(&c).Where("id = ?", c.ID).Updates(map[string]interface{}{"update_time": c.UpdateTime,
		"update_user": c.UpdateUser, "is_deleted": c.IsDeleted}).Error
}

func (c Zigbee) IsExistedBySN() bool {
	var count int64
	_ = Db.Debug().Model(&c).Where("  sn = ? and is_deleted = ?",
		c.Sn, c.IsDeleted).Count(&count).Error
	return count > 0
}

func (c Zigbee) IsExistedByNameAndCode() bool {
	var devices []Zigbee
	err := Db.Debug().Model(&c).Where(" sn = ? and is_deleted = ?",
		c.Sn, c.IsDeleted).Find(&devices).Error
	//如果查询不到，返回相应的错误
	if gorm.ErrRecordNotFound == err {
		return false
	}
	for _, d := range devices {
		if d.ID != c.ID {
			return true
		}
	}
	return false
}

func (c *Zigbee) Create() error {
	return Db.Debug().Model(&c).Save(&c).Error
}

func (c *Zigbee) Update() error {
	return Db.Debug().Model(&c).Where(" id = ? ", c.ID).Updates(&c).Error
}

func (c *Zigbee) GetDevice() error {
	err := Db.Debug().Model(&c).Where(" id = ? ", c.ID).Scan(&c).Error
	return err
}

func (c Zigbee) GetDevices(offset, limit int) ([]Zigbee, int64, error) {
	var devices []Zigbee
	var count int64
	db := Db.Debug().Model(&c).Where("is_deleted=0 and name like ? ", "%"+c.Name+"%")
	db.Count(&count)
	err := db.Offset(offset).Limit(limit).Find(&devices).Error
	return devices, count, err
}

func (c Zigbee) GetAllDevices() ([]Zigbee, error) {
	var devices []Zigbee
	err := Db.Debug().Model(&c).Where(" tenant_id = ? and is_deleted = ? ", c.TenantId, c.IsDeleted).Scan(&devices).Error
	return devices, err
}

func (c Zigbee) GetDevicesByGateway() []Zigbee {
	var devices []Zigbee
	Db.Debug().Model(&c).Where(" gateway_id = ? and is_deleted = 0",
		c.GatewayId).Find(&devices)
	return devices
}

func (c Zigbee) GetDevicesByLampPole() []Zigbee {
	var devices []Zigbee
	Db.Debug().Model(&c).Where("lamp_pole_id = ? and is_deleted = 0",
		c.LampPoleId).Find(&devices)
	return devices
}
