package data_manage

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

type BaseFromCCFIndex struct {
	BaseFromCcfIndexId int `orm:"column(base_from_ccf_index_id);pk"`
	ClassifyId         int
	IndexCode          string
	IndexName          string
	Frequency          string
	Unit               string
	Sort               int
	CreateTime         time.Time
	ModifyTime         time.Time
}

type BaseFromCCFIndexList struct {
	BaseFromCcfIndexId int `orm:"column(base_from_ccf_index_id);pk"`
	ClassifyId         int
	IndexCode          string
	IndexName          string
	Frequency          string
	Unit               string
	Sort               int
	CreateTime         string
	ModifyTime         string
	DataList           []*BaseFromCCFData
	Paging             *paging.PagingItem `description:"分页数据"`
}

type CCFSingleDataResp struct {
	BaseFromCcfIndexId int
	ClassifyId         int
	IndexCode          string
	IndexName          string
	Frequency          string
	Unit               string
	CreateTime         string
	ModifyTime         string
	Data               []*CCFSingleData
}

type CCFSingleData struct {
	Value    string `orm:"column(value)" description:"日期"`
	DataTime string `orm:"column(data_time)" description:"值"`
}

func GetCCFIndex(condition string, pars interface{}) (items []*BaseFromCCFIndexList, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT * FROM base_from_ccf_index WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	sql += ` ORDER BY sort ASC, base_from_ccf_index_id asc`
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

func GetCCFIndexDataCount(indexCode string) (count int, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT COUNT(1) AS count FROM base_from_ccf_data WHERE index_code=? `
	err = o.Raw(sql, indexCode).QueryRow(&count)
	return
}

type CCFIndexDataCountGroup struct {
	IndexCode string
	Count     int
}

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

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

func GetCCFIndexDataByCodes(indexCode []string) (items []*BaseFromCCFData, err error) {
	if len(indexCode) <= 0 {
		return
	}
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT *  FROM base_from_ccf_data WHERE index_code in (` + utils.GetOrmInReplace(len(indexCode)) + `) ORDER BY data_time DESC  `
	_, err = o.Raw(sql, indexCode).QueryRows(&items)
	return
}

type BaseFromCCFData struct {
	BaseFromCcfDataId  int `orm:"column(base_from_ccf_data_id);pk"`
	BaseFromCcfIndexId int
	IndexCode          string
	DataTime           string
	Value              string
	CreateTime         string
	ModifyTime         string
	DataTimestamp      int64
}

type BaseFromCCFIndexSearchItem struct {
	BaseFromCcfIndexId int `orm:"column(base_from_ccf_index_id);pk"`
	ClassifyId         int
	IndexCode          string
	IndexName          string
}

// GetCCFItemList 模糊查询CCF数据库指标列表
func GetCCFItemList(condition string) (items []*BaseFromCCFIndexSearchItem, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := "SELECT * FROM base_from_ccf_index WHERE 1=1"
	if condition != "" {
		sql += condition
	}
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func GetCCFIndexDataByCode(indexCode string) (list []*BaseFromCCFData, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT * FROM base_from_ccf_data WHERE index_code=? `
	_, err = o.Raw(sql, indexCode).QueryRows(&list)
	return
}

func GetBaseFromCCFIndexByIndexCode(indexCode string) (list *BaseFromCCFIndex, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT * FROM base_from_ccf_index WHERE index_code=? `
	err = o.Raw(sql, indexCode).QueryRow(&list)
	return
}
