package data_manage

import (
	"eta/eta_api/global"
	"eta/eta_api/utils"
	"fmt"
	"gorm.io/gorm"
	"time"

	"github.com/rdlucklib/rdluck_tools/paging"
)

type BaseFromMtjhMapping struct {
	BaseFromMtjhMappingId int       `orm:"column(base_from_mtjh_mapping_id);pk" gorm:"primaryKey"`
	IndexName             string    `description:"持买单量指标名称"`
	IndexCode             string    `description:"持买单量指标编码"`
	CreateTime            time.Time `description:"时间"`
	Area                  string    `description:"区域"`
	Port                  string    `description:"港口或码头"`
	Variety               string    `description:"品种"`
	Unit                  string    `description:"单位"`
	Frequency             string    `description:"频率"`
}

type BaseFromMtjhIndex struct {
	BaseFromMtjhIndexId int       `orm:"column(base_from_mtjh_index_id);pk" gorm:"primaryKey"`
	IndexName           string    `description:"持买单量指标名称"`
	IndexCode           string    `description:"持买单量指标编码"`
	DealValue           string    `description:"成交量"`
	DataTime            string    `description:"数据日期"`
	Area                string    `description:"区域"`
	Port                string    `description:"港口或码头"`
	Unit                string    `description:"单位"`
	Frequency           string    `description:"频率"`
	Variety             string    `description:"品种"`
	CreateTime          time.Time `description:"插入时间"`
	ModifyTime          time.Time `description:"修改时间"`
}

type BaseFromMtjhIndexItem struct {
	BaseFromMtjhIndexId int    `orm:"column(base_from_mtjh_index_id);pk" gorm:"primaryKey"`
	IndexName           string `description:"持买单量指标名称"`
	IndexCode           string `description:"持买单量指标编码"`
	DealValue           string `description:"成交量"`
	DataTime            string `description:"数据日期"`
	Area                string `description:"区域"`
	Port                string `description:"港口或码头"`
	Unit                string `description:"单位"`
	Frequency           string `description:"频率"`
	Variety             string `description:"品种"`
	CreateTime          string `description:"插入时间"`
	ModifyTime          string `description:"修改时间"`
}

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

// 查询指标
func GetBaseFromMtjhMapping() (items []*BaseFromMtjhMapping, err error) {
	o := global.DbMap[utils.DbNameMaster]
	sql := `SELECT * FROM base_from_mtjh_mapping`
	err = o.Raw(sql).Find(&items).Error
	return
}

// 查询指标
func GetBaseFromMtjhIndex() (items []*BaseFromMtjhIndex, err error) {
	o := global.DbMap[utils.DbNameMaster]
	sql := `SELECT * FROM base_from_mtjh_index`
	err = o.Raw(sql).Find(&items).Error
	return
}

// 添加数据
func AddBaseFromMtjhIndex(item *BaseFromMtjhIndex) (lastId int64, err error) {
	o := global.DbMap[utils.DbNameMaster]
	err = o.Create(item).Error
	lastId = int64(item.BaseFromMtjhIndexId)
	return
}

func AddBaseFromMtjhIndexMuti(items []*BaseFromMtjhIndex) (lastId int64, err error) {
	o := global.DbMap[utils.DbNameMaster]
	err = o.CreateInBatches(items, utils.MultiAddNum).Error
	return
}

// 添加指标
func AddBaseFromMtjhMapping(item *BaseFromMtjhMapping) (lastId int64, err error) {
	o := global.DbMap[utils.DbNameMaster]
	err = o.Create(item).Error
	lastId = int64(item.BaseFromMtjhMappingId)
	return
}

func AddBaseFromMtjhMappingMuti(items []*BaseFromMtjhMapping) (lastId int64, err error) {
	o := global.DbMap[utils.DbNameMaster]
	err = o.CreateInBatches(items, utils.MultiAddNum).Error
	return
}

func UpdateBaseFromMtjhIndex(item *BaseFromMtjhIndex) (err error) {
	o := global.DbMap[utils.DbNameMaster]
	sql := `UPDATE base_from_mtjh_index SET deal_value=?  WHERE index_name=?  AND  data_time = ?`
	err = o.Exec(sql, item.DealValue, item.IndexName, item.DataTime).Error
	return
}

func GetMtjhClassifyList() (list []*BaseFromMtjhMapping, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := "SELECT * FROM base_from_mtjh_mapping group by area"
	err = o.Raw(sql).Find(&list).Error
	return
}

type BaseFromMtjhMappingItem struct {
	BaseFromMtjhMappingId int    `orm:"column(base_from_mtjh_mapping_id);pk" gorm:"primaryKey"`
	IndexName             string `description:"持买单量指标名称"`
	IndexCode             string `description:"持买单量指标编码"`
	CreateTime            string `description:"时间"`
	Area                  string `description:"区域"`
	Port                  string `description:"港口或码头"`
	Variety               string `description:"品种"`
	Unit                  string `description:"单位"`
	Frequency             string `description:"频率"`
}

func (obj *BaseFromMtjhMappingItem) AfterFind(tx *gorm.DB) (err error) {
			obj.CreateTime = utils.GormDateStrToDateTimeStr(obj.CreateTime)
	return
}
func GetMtjhMapping(condition string, pars []interface{}) (items []*BaseFromMtjhMappingItem, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := ` SELECT * FROM base_from_mtjh_mapping WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	sql += ` ORDER BY base_from_mtjh_mapping_id asc`
	err = o.Raw(sql, pars...).Find(&items).Error
	return
}

type BaseFromMtjhIndexList struct {
	BaseFromMtjhMappingId int                      `orm:"column(base_from_mtjh_mapping_id);pk" gorm:"primaryKey"`
	IndexName             string                   `description:"持买单量指标名称"`
	IndexCode             string                   `description:"持买单量指标编码"`
	Area                  string                   `description:"区域"`
	Port                  string                   `description:"港口或码头"`
	Unit                  string                   `description:"单位"`
	Frequency             string                   `description:"频率"`
	CreateTime            string                   `description:"插入时间"`
	ModifyTime            string                   `description:"修改时间"`
	Variety               string                   `description:"品种"`
	DataList              []*BaseFromMtjhIndexItem `gorm:"-"`
	Paging                *paging.PagingItem       `description:"分页数据" gorm:"-"`
}

func GetMtjhIndexDataCount(indexCode string) (count int, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := ` SELECT COUNT(1) AS count  FROM base_from_mtjh_index WHERE index_code=? `
	err = o.Raw(sql, indexCode).Scan(&count).Error
	return
}

func GetMtjhIndexData(indexCode string, startSize, pageSize int) (items []*BaseFromMtjhIndexItem, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := ` SELECT *  FROM base_from_mtjh_index WHERE index_code=? ORDER BY data_time DESC LIMIT ?,? `
	err = o.Raw(sql, indexCode, startSize, pageSize).Find(&items).Error
	return
}

// GetMtjhItemList 模糊查询煤炭江湖数据库指标列表
func GetMtjhItemList(keyword string) (items []*BaseFromMtjhMappingItem, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := "SELECT * FROM base_from_mtjh_mapping WHERE CONCAT(index_name,index_code) LIKE ? "
	err = o.Raw(sql, utils.GetLikeKeyword(keyword)).Find(&items).Error
	return
}

// 查询数据
func GetBaseFromMtjhIndexByCode(indexCode string) (items []*BaseFromMtjhIndexItem, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := `SELECT * FROM base_from_mtjh_index WHERE index_code=? ORDER BY data_time DESC `
	err = o.Raw(sql, indexCode).Find(&items).Error
	return
}

// GetMtjhMappingItemByCode
func GetMtjhMappingItemByCode(indexCode string) (item *BaseFromMtjhMappingItem, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := "SELECT * FROM base_from_mtjh_mapping WHERE index_code=? "
	err = o.Raw(sql, indexCode).First(&item).Error
	return
}

// GetMtjhFrequencyByArea
func GetMtjhFrequencyByArea(area string) (items []*string, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := "SELECT frequency FROM base_from_mtjh_index WHERE area=?  group by area "
	err = o.Raw(sql, area).Find(&items).Error
	return
}

func GetClassifyMtjhByArea(area string) (items []*string, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := `SELECT DISTINCT index_code FROM base_from_mtjh_index WHERE area=? `
	err = o.Raw(sql, area).Find(&items).Error
	return
}

func GetCoalMtjhMaxCount(area string) (count int, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := `SELECT
	COALESCE(MAX(t.num), 0) AS count
FROM
	(
	SELECT
		COUNT( 1 ) AS num 
	FROM
		base_from_mtjh_index 
	WHERE
		area =? 
GROUP BY
	index_name ) AS t `
	err = o.Raw(sql, area).Scan(&count).Error
	return
}

func GetMtjhCount(indexCode string) (count int, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := `SELECT
		COUNT( 1 ) AS num 
	FROM
		base_from_mtjh_index
	WHERE
		index_code =? `
	err = o.Raw(sql, indexCode).Scan(&count).Error
	return
}

func GetMtjhIndexLatestDate(indexCode string) (ModifyTime string, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := ` SELECT modify_time FROM base_from_mtjh_index WHERE index_code=? ORDER BY modify_time DESC limit 1 `
	err = o.Raw(sql, indexCode).Scan(&ModifyTime).Error
			ModifyTime = utils.GormDateStrToDateTimeStr(ModifyTime)
	return
}

// GetMtjhItemsByCondition 获取煤炭江湖指标
func GetMtjhItemsByCondition(cond string, pars []interface{}) (items []*BaseFromMtjhMappingItem, err error) {
	o := global.DbMap[utils.DbNameIndex]
	sql := fmt.Sprintf(`SELECT * FROM base_from_mtjh_mapping WHERE 1=1 %s`, cond)
	err = o.Raw(sql, pars...).Find(&items).Error
	return
}