package dao

import (
	"iot_manager_service/util/common"
	"time"
)

//CameraDevice 网关下挂载的设备, 摄像头
type CameraDevice struct {
	ID               int         `gorm:"primary_key" json:"id"`                          //编号
	DeviceName       string      `gorm:"type:varchar(64)" json:"deviceName"`             //设备名称
	DeviceSN         string      `gorm:"type:varchar(64)" json:"deviceSn"`               //设备序列号
	CameraType       int         `gorm:"type:int" json:"cameraType"`                     //摄像机类型 0=枪机,1=球机
	GatewayId        int         `gorm:"type:int" json:"gatewayId"`                      //所属网关
	LampPoleId       int         `gorm:"type:int" json:"lampPoleId"`                     //归属灯杆 灯杆ID
	LampPoleName     string      `gorm:"type:varchar(64)" json:"lampPoleName"`           //灯杆名称
	LampPoleSn       string      `gorm:"type:varchar(64)" json:"lampPoleSn"`             //灯杆sn
	LampPoleLocation string      `gorm:"type:varchar(255)" json:"lampPoleLocation"`      //灯杆安装位置
	LampLat          float64     `gorm:"type:double(17,14)" json:"lampLat"`              //经度
	LampLng          float64     `gorm:"type:double(17,14)" json:"lampLng"`              //纬度
	GroupId          int         `gorm:"type:int" json:"groupId"`                        //灯杆分组ID
	BrandId          int         `gorm:"type:int" json:"brandId"`                        //设备品牌
	ModelId          int         `gorm:"type:int" json:"modelId"`                        //设备型号
	RatedPower       float32     `gorm:"type:float(8,2);default 0.00" json:"ratedPower"` //功率
	MonitorAddress   string      `gorm:"type:varchar(255)" json:"monitorAddress"`        //监控地址 ip:端口
	IPAddress        string      `gorm:"type:varchar(40)" json:"ipAddress"`              //IP地址
	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=正常,1=异常
	Tag              string      `gorm:"type:varchar(255)" json:"tag"`                   //标签，(备用，逗号区分)
	IsEnable         int         `gorm:"type:int;default 2" json:"isEnable"`             //启用禁用：1启用，2禁用
	StreamId         string      `gorm:"type:varchar(100)" json:"streamId"`              //流id
}

func (CameraDevice) TableName() string {
	return "device_camera"
}

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

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

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

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

func (c CameraDevice) GetDevices(offset, limit int) ([]CameraDevice, int64, error) {
	var devices []CameraDevice
	var count int64
	db := Db.Debug().Model(&c)
	if c.DeviceSN != "" {
		db = db.Where("device_name like ? or device_sn like ?", "%"+c.DeviceSN+"%", "%"+c.DeviceSN+"%")
	}
	if c.CameraType != -1 {
		db = db.Where("camera_type = ?", c.CameraType)
	}

	db = db.Where("is_deleted = 0")
	db.Count(&count)
	err := db.Offset(offset).Limit(limit).Find(&devices).Error
	return devices, count, err
}

func (c *CameraDevice) 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 CameraDevice) GetAllDevices() ([]*CameraDevice, error) {
	var devices []*CameraDevice
	err := Db.Debug().Model(&c).Where(" tenant_id = ? and is_deleted = ? ", c.TenantId, c.IsDeleted).Scan(&devices).Error
	return devices, err
}

func (c *CameraDevice) UpdateEnable() error {
	return Db.Debug().Model(&c).Where(" id = ? ", c.ID).Updates(map[string]interface{}{"is_enable": c.IsEnable}).Error
}

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

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

func (c CameraDevice) GetDevicesByLampPoleGroup() []CameraDevice {
	var devices []CameraDevice
	Db.Debug().Model(&c).Where("group_id = ? and is_deleted = 0",
		c.GroupId).Find(&devices)
	return devices
}

func (c CameraDevice) GetDevicesByIds(ids string) []CameraDevice {
	var devices []CameraDevice
	db := Db.Debug().Model(&c).Where("is_deleted = 0")
	db.Where("id in (" + ids + ")")
	db.Find(&devices)
	return devices
}
