package edbmonitor

import (
	"eta/eta_api/utils"
	"time"

	"github.com/beego/beego/v2/client/orm"
)

type EdbMonitorInfo struct {
	EdbMonitorId         int       `orm:"column(edb_monitor_id);pk"`
	EdbMonitorClassifyId int       `description:"预警分类id"`
	EdbMonitorName       string    `description:"预警名称"`
	EdbInfoId            int       `description:"指标id"`
	EdbInfoType          int       `description:"指标类型"`
	EdbUniqueCode        string    `description:"指标唯一标识"`
	EdbClassifyId        int       `description:"指标id"`
	EdbCode              string    `description:"指标编码"`
	Source               int       `description:"指标来源"`
	SubSource            int       `description:"指标子来源: 0-经济数据库;1-日期序列;2-高频数据"`
	EdbLatestDate        string    `description:"最新日期"`
	EdbLatestValue       float64   `description:"指标最新值"`
	MonitorType          int       `description:"突破方式: 0-向上突破;1-向下突破"`
	MonitorData          float64   `description:"预警值"`
	MonitorLevel         string    `description:"预警等级"`
	State                int       `description:"预警状态: 0-已关闭;1-未触发;2-已触发"`
	EdbTriggerDate       time.Time `description:"触发日期"`
	MonitorTriggerTime   time.Time `description:"预警触发时间"`
	CreateUserId         int       `description:"创建人id"`
	CreateTime           time.Time `description:"创建时间"`
	ModifyTime           time.Time `description:"修改时间"`
}

func (m *EdbMonitorInfo) Insert() (int64, error) {
	o := orm.NewOrmUsingDB("data")
	return o.Insert(m)
}

func (m *EdbMonitorInfo) Update(cols []string) (err error) {
	if len(cols) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("data")
	_, err = o.Update(m, cols...)
	return
}

func GetEdbMonitorLevelList() (list []string, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT DISTINCT monitor_level FROM edb_monitor_info`
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

func GetEdbMonitorEdbInfoList() (items []*EdbMonitorInfo, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT * FROM edb_monitor_info WHERE state <> 0`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func DeleteEdbMonitorInfoById(id int) (err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `DELETE FROM edb_monitor_info WHERE edb_monitor_id =?`
	_, err = o.Raw(sql, id).Exec()
	return
}

func DeleteEdbMonitorInfoByIdList(ids []int) (err error) {
	if len(ids) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("data")
	sql := `DELETE FROM edb_monitor_info WHERE edb_monitor_id IN(` + utils.GetOrmInReplace(len(ids)) + `)`
	_, err = o.Raw(sql, ids).Exec()
	return
}

func GetEdbMonitorInfoById(id int) (item *EdbMonitorInfo, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT * FROM edb_monitor_info WHERE edb_monitor_id =?`
	err = o.Raw(sql, id).QueryRow(&item)
	return
}

func GetEdbMonitorInfoByEdbInfoId(edbInfoId int) (items []*EdbMonitorInfo, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT * FROM edb_monitor_info WHERE edb_info_id =?`
	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
	return
}

func GetEdbMonitorInfoCountByClassifyId(classifyId []int) (count int, err error) {
	if len(classifyId) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT COUNT(*) AS count FROM edb_monitor_info WHERE edb_monitor_classify_id IN(` + utils.GetOrmInReplace(len(classifyId)) + `)`
	err = o.Raw(sql, classifyId).QueryRow(&count)
	return
}

func GetEdbMonitorInfoCountByCondition(condition string, pars []interface{}) (count int, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT COUNT(*) AS count FROM edb_monitor_info WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	err = o.Raw(sql, pars).QueryRow(&count)
	return
}

func GetEdbMonitorInfoPageByCondition(condition string, pars []interface{}, startSize int, pageSize int) (items []*EdbMonitorInfo, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT * FROM edb_monitor_info WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	sql += ` ORDER BY create_time DESC LIMIT?,?`
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

func GetEdbMonitorCreateUserId() (userIds []int, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT DISTINCT create_user_id FROM edb_monitor_info`
	_, err = o.Raw(sql).QueryRows(&userIds)
	return
}