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

import (
	"eta/eta_api/global"
	"eta/eta_api/utils"

	"gorm.io/gorm"
)

type BaseFromRzdData struct {
	BaseFromRzdDataId  int     `orm:"column(base_from_rzd_data_id);pk" gorm:"primaryKey"`
	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)"`
}

func (baseFromRzdData *BaseFromRzdData) AfterFind(tx *gorm.DB) (err error) {
			baseFromRzdData.ModifyTime = utils.GormDateStrToDateTimeStr(baseFromRzdData.ModifyTime)
			baseFromRzdData.CreateTime = utils.GormDateStrToDateTimeStr(baseFromRzdData.CreateTime)
			baseFromRzdData.DataTime = utils.GormDateStrToDateStr(baseFromRzdData.DataTime)
	return
}

// 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 GetRzdIndexDataCountGroup(indexCodes []string) (items []*RzdIndexDataCountGroup, err error) {
	if len(indexCodes) <= 0 {
		return
	}
	o := global.DbMap[utils.DbNameIndex]
	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).Find(&items).Error
	return
}

func GetRzdIndexData(indexCode string, startSize, pageSize int) (items []*BaseFromRzdData, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := ` SELECT *  FROM base_from_rzd_data WHERE index_code=? ORDER BY data_time DESC LIMIT ?,? `
	err = o.Raw(sql, indexCode, startSize, pageSize).Find(&items).Error
	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 := global.DbMap[utils.DbNameIndex]
	err = o.Raw(sql, indexCode).Find(&items).Error
	return
}

func GetBaseFormRzdDataByConditionCount(condition string, pars []interface{}) (count int, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := ` SELECT count(1) FROM base_from_rzd_data WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	err = o.Raw(sql, pars...).Scan(&count).Error
	if err != nil {
		return 0, err
	}
	return
}

func GetBaseFormRzdDataByCondition(condition string, pars []interface{}) (items []*BaseFromRzdData, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := ` SELECT * FROM base_from_rzd_data WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	err = o.Raw(sql, pars...).Find(&items).Error
	return
}

// GetRzdDataListByIndexCodes 根据指标编码查询
func GetRzdDataListByIndexCodes(IndexCodes string) (items []string, err error) {
	sql := ` SELECT DISTINCT data_time FROM base_from_rzd_data WHERE index_code IN(` + IndexCodes + `)  ORDER BY data_time DESC `
	o := global.DbMap[utils.DbNameIndex]
	err = o.Raw(sql).Find(&items).Error
		for i := 0; i < len(items); i++ {
			items[i] = utils.GormDateStrToDateStr(items[i])
		}
	return
}

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

	// 构造 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).Find(&items).Error
	if err != nil {
		return nil, err
	}
	return items, nil
}