package data_manage

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

type GlClassify struct {
	BreedShortName string `orm:"column(BREED_SHORT_NAME)" description:"分类名称"`
}

func GetGlSurveyClassify() (items []*GlClassify, err error) {
	sql := ` SELECT CASE WHEN BREED_SHORT_NAME IS NULL THEN '无' ELSE BREED_SHORT_NAME END BREED_SHORT_NAME  FROM mb_index_main_info GROUP BY BREED_SHORT_NAME ORDER BY BREED_SHORT_NAME ASC `
	o := orm.NewOrmUsingDB("gl")
	o.Raw(sql).QueryRows(&items)
	return
}

type GlFrequency struct {
	Frequency string `description:"频度:1-日度 2-周度 3-月度 4-季度 5-年度 99-无固定频率"`
}

func GetGlFrequencyByClassifyId(breedShortName string) (items []*GlFrequency, err error) {
	o := orm.NewOrmUsingDB("gl")
	if breedShortName == "无" {
		sql := ` SELECT FREQUENCY_NAME AS frequency FROM mb_index_main_info WHERE BREED_SHORT_NAME IS NULL GROUP BY FREQUENCY_CODE ORDER BY FREQUENCY_CODE ASC `
		_, err = o.Raw(sql).QueryRows(&items)
		return
	} else {
		sql := ` SELECT FREQUENCY_NAME AS frequency FROM mb_index_main_info WHERE BREED_SHORT_NAME=? GROUP BY FREQUENCY_CODE ORDER BY FREQUENCY_CODE ASC `
		_, err = o.Raw(sql, breedShortName).QueryRows(&items)
		return
	}
}

type GlIndex struct {
	Id            int    `orm:"column(ID)"`
	IndexCode     string `orm:"column(INDEX_CODE)"`
	IndexName     string `orm:"column(INDEX_NAME)"`
	UnitName      string `orm:"column(UNIT_NAME)"`
	FrequencyName string `orm:"column(FREQUENCY_NAME)"`
	UpdateTime    string `orm:"column(UPDATE_TIME)"`
}

func GetGlIndex(breedShortName, frequency string) (items []*GlIndex, err error) {
	o := orm.NewOrmUsingDB("gl")
	if breedShortName == "无" {
		sql := ` SELECT * FROM mb_index_main_info WHERE BREED_SHORT_NAME IS NULL AND FREQUENCY_NAME=? ORDER BY INDEX_CODE ASC `
		_, err = o.Raw(sql, frequency).QueryRows(&items)
		return
	} else {
		sql := ` SELECT * FROM mb_index_main_info WHERE BREED_SHORT_NAME=? AND FREQUENCY_NAME=? ORDER BY INDEX_CODE ASC `
		_, err = o.Raw(sql, breedShortName, frequency).QueryRows(&items)
		return
	}
}

func GetGlFrequency(productName string) (items []*string, err error) {
	sql := `SELECT DISTINCT FREQUENCY_NAME FROM mb_index_main_info WHERE BREED_SHORT_NAME=? ORDER BY FIELD(FREQUENCY_NAME,'日度','周度','旬度','月度','季度','半年','年度') `
	o := orm.NewOrmUsingDB("gl")
	_, err = o.Raw(sql, productName).QueryRows(&items)
	return
}

type GlIndexList struct {
	Id            int                `orm:"column(ID)"`
	IndexCode     string             `orm:"column(INDEX_CODE)"`
	IndexName     string             `orm:"column(INDEX_NAME)"`
	UnitName      string             `orm:"column(UNIT_NAME)"`
	FrequencyName string             `orm:"column(FREQUENCY_NAME)"`
	UpdateTime    string             `orm:"column(UPDATE_TIME)"`
	Paging        *paging.PagingItem `description:"分页数据"`
	DataList      []*GlIndexData
}

type GlIndexData struct {
	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
}

func GetGlIndexData(indexCode string, startSize, pageSize int) (items []*GlIndexData, err error) {
	//sql := ` SELECT *  FROM mb_index_main_data WHERE INDEX_CODE=? ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC LIMIT ?,?`
	sql := ` SELECT * FROM (
	SELECT DISTINCT a.INDEX_CODE,a.DATA_VALUE,a.DATA_DATE FROM mb_index_main_data AS a WHERE INDEX_CODE=? AND IS_DELETE=0
	ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC 
	)AS t
	GROUP BY t.DATA_DATE
	ORDER BY t.DATA_DATE DESC LIMIT ?,? `
	o := orm.NewOrmUsingDB("gl")
	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
	return
}

func GetGlIndexByCode(indexCode string) (items *GlIndex, err error) {
	sql := ` SELECT *  FROM mb_index_main_info WHERE INDEX_CODE=? `
	o := orm.NewOrmUsingDB("gl")
	err = o.Raw(sql, indexCode).QueryRow(&items)
	return
}

func GetGlIndexDataCount(indexCode string) (count int, err error) {
	o := orm.NewOrmUsingDB("gl")
	sql := `SELECT COUNT(1) AS count FROM (
			SELECT * FROM (
				SELECT DISTINCT a.INDEX_CODE,a.DATA_VALUE,a.DATA_DATE FROM mb_index_main_data AS a WHERE INDEX_CODE=? AND IS_DELETE=0
				ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC 
				)AS t
				GROUP BY t.DATA_DATE
				ORDER BY t.DATA_DATE DESC
			)AS n `
	err = o.Raw(sql, indexCode).QueryRow(&count)
	return
}

type GlSearchIndex struct {
	Id             int    `orm:"column(ID)"`
	IndexCode      string `orm:"column(INDEX_CODE)"`
	IndexName      string `orm:"column(INDEX_NAME)"`
	UnitName       string `orm:"column(UNIT_NAME)"`
	FrequencyName  string `orm:"column(FREQUENCY_NAME)"`
	UpdateTime     string `orm:"column(UPDATE_TIME)"`
	BreedShortName string `orm:"column(BREED_SHORT_NAME)"`
}

// GetGlItemList 模糊查询隆众数据库指标列表
func GetGlItemList(keyword string) (items []*GlSearchIndex, err error) {
	o := orm.NewOrmUsingDB("gl")
	sql := "SELECT * FROM mb_index_main_info WHERE CONCAT(INDEX_NAME,INDEX_CODE) LIKE ? "
	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
	return

}

func GetGlDataMaxCount(classifyName string) (count int, err error) {
	o := orm.NewOrmUsingDB("gl")
	sql := `SELECT MAX(t.num) AS count FROM (
				SELECT COUNT(1) AS num  FROM mb_index_main_info AS a
				INNER JOIN mb_index_main_data AS b ON a.INDEX_CODE=b.INDEX_CODE
				WHERE a.BREED_SHORT_NAME=?
				GROUP BY a.INDEX_CODE
			)AS t `
	err = o.Raw(sql, classifyName).QueryRow(&count)
	return
}

func GetGlDataByCode(indexCode string) (items []*GlIndexData, err error) {
	o := orm.NewOrmUsingDB("gl")
	sql := `SELECT
	* 
FROM
	( SELECT * FROM mb_index_main_data WHERE INDEX_CODE = ? GROUP BY UPDATE_TIME DESC, DATA_DATE DESC ) a 
GROUP BY
	a.DATA_DATE DESC `
	_, err = o.Raw(sql, indexCode).QueryRows(&items)
	return
}