// Package data_manage @Author gmy 2024/8/7 9:50:00
package data_manage

import (
	"eta/eta_api/utils"
	"github.com/beego/beego/v2/client/orm"
)

type BaseFromRzdData struct {
	BaseFromRzdDataId  int     `orm:"column(base_from_rzd_data_id);pk"`
	BaseFromRzdIndexId int     `orm:"column(base_from_rzd_index_id)"`
	CreateTime         string  `orm:"column(create_time)"`
	DataTime           string  `orm:"column(data_time)"`
	IndexCode          string  `orm:"column(index_code)"`
	ModifyTime         string  `orm:"column(modify_time)"`
	Value              float64 `orm:"column(value)"`
}

// RzdIndexAddReq 指标添加vo
type RzdIndexAddReq struct {
	EdbCode       string `description:"指标编码"`
	EdbName       string `description:"指标名称"`
	Frequency     string `description:"频度"`
	Unit          string `description:"单位"`
	ClassifyId    int    `description:"分类ID"`
	AdminId       int    `description:"管理员ID"`
	AdminRealName string `description:"管理员名称"`
}

type RzdIndexDataCountGroup struct {
	IndexCode string
	Count     int
}

func init() {
	orm.RegisterModel(new(BaseFromRzdData))
}

func GetRzdIndexDataCountGroup(indexCodes []string) (items []*RzdIndexDataCountGroup, err error) {
	if len(indexCodes) <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT COUNT(1) AS count, index_code FROM base_from_rzd_data WHERE index_code IN (` + utils.GetOrmInReplace(len(indexCodes)) + `) GROUP BY index_code`
	_, err = o.Raw(sql, indexCodes).QueryRows(&items)
	return
}

func GetRzdIndexData(indexCode string, startSize, pageSize int) (items []*BaseFromRzdData, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT *  FROM base_from_rzd_data WHERE index_code=? ORDER BY data_time DESC LIMIT ?,? `
	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
	return
}

// GetBaseFormRzdDataByIndexCode 根据指标编码查询
func GetBaseFormRzdDataByIndexCode(indexCode string) (items []*BaseFromRzdData, err error) {
	sql := `SELECT * FROM base_from_rzd_data WHERE index_code=? ORDER BY data_time desc`
	o := orm.NewOrmUsingDB("data")
	_, err = o.Raw(sql, indexCode).QueryRows(&items)
	return
}

func GetBaseFormRzdDataByConditionCount(condition string, pars interface{}) (count int, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT count(1) FROM base_from_rzd_data WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	err = o.Raw(sql, pars).QueryRow(&count)
	if err != nil {
		return 0, err
	}
	return
}

func GetBaseFormRzdDataByCondition(condition string, pars interface{}) (items []*BaseFromRzdData, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT * FROM base_from_rzd_data WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

// GetRzdDataListByIndexCodes 根据指标编码查询
func GetRzdDataListByIndexCodes(IndexCodes string) (items []string, err error) {
	sql := ` SELECT data_time FROM base_from_rzd_data WHERE index_code IN(` + IndexCodes + `)  GROUP BY data_time DESC `
	o := orm.NewOrmUsingDB("data")
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// GetRzdLastUpdateTimeLastByIndexCode 根据指标编码查询 返回ModifyTime最后一条数据
func GetRzdLastUpdateTimeLastByIndexCode(indexCodes []string) (items []*BaseFromRzdData, err error) {
	o := orm.NewOrmUsingDB("data")

	// 构造 SQL 查询
	sql := `SELECT t1.index_code, t1.data_time, t2.value
			FROM (
    			SELECT index_code, MAX(data_time) AS data_time
   				 FROM base_from_rzd_data
    			WHERE index_code IN (` + utils.GetOrmInReplace(len(indexCodes)) + `)
    			GROUP BY index_code
			) AS t1
			JOIN base_from_rzd_data AS t2 ON t1.index_code = t2.index_code AND t1.data_time = t2.data_time`

	// 执行 SQL 查询
	_, err = o.Raw(sql, indexCodes).QueryRows(&items)
	if err != nil {
		return nil, err
	}
	return items, nil
}