package data_manage

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

// BaseFromBloombergIndex 彭博原始指标表
type BaseFromBloombergIndex struct {
	BaseFromBloombergIndexId int       `orm:"column(base_from_bloomberg_index_id);pk"`
	IndexCode                string    `description:"指标编码"`
	IndexName                string    `description:"指标名称"`
	Unit                     string    `description:"单位"`
	Source                   int       `description:"数据来源"`
	Frequency                string    `description:"频度"`
	StartDate                time.Time `description:"开始日期"`
	EndDate                  time.Time `description:"结束日期"`
	Describe                 string    `description:"指标描述"`
	Sort                     int       `description:"排序"`
	IsStop                   int       `description:"是否停更:0-否;1-停更"`
	EdbExist                 int       `description:"指标库是否已添加:0-否;1-是"`
	TerminalCode             string    `description:"所属终端编码"`
	FilePath                 string    `description:"文件存储路径"`
	CreateTime               time.Time `description:"创建时间"`
	ModifyTime               time.Time `description:"修改时间"`
}

var BaseFromBloombergIndexCols = struct {
	BaseFromBloombergIndexId string
	IndexCode                string
	IndexName                string
	Unit                     string
	Source                   string
	Frequency                string
	StartDate                string
	EndDate                  string
	Describe                 string
	Sort                     string
	IsStop                   string
	EdbExist                 string
	TerminalCode             string
	FilePath                 string
	CreateTime               string
	ModifyTime               string
}{
	BaseFromBloombergIndexId: "base_from_bloomberg_index_id",
	IndexCode:                "index_code",
	IndexName:                "index_name",
	Unit:                     "unit",
	Source:                   "source",
	Frequency:                "frequency",
	StartDate:                "start_date",
	EndDate:                  "end_date",
	Describe:                 "describe",
	Sort:                     "sort",
	IsStop:                   "is_stop",
	EdbExist:                 "edb_exist",
	TerminalCode:             "terminal_code",
	FilePath:                 "file_path",
	CreateTime:               "create_time",
	ModifyTime:               "modify_time",
}

func (m *BaseFromBloombergIndex) TableName() string {
	return "base_from_bloomberg_index"
}

func (m *BaseFromBloombergIndex) PrimaryId() string {
	return BaseFromBloombergIndexCols.BaseFromBloombergIndexId
}

func (m *BaseFromBloombergIndex) Create() (err error) {
	o := orm.NewOrmUsingDB("data")
	id, err := o.Insert(m)
	if err != nil {
		return
	}
	m.BaseFromBloombergIndexId = int(id)
	return
}

func (m *BaseFromBloombergIndex) CreateMulti(items []*BaseFromBloombergIndex) (err error) {
	if len(items) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("data")
	_, err = o.InsertMulti(len(items), items)
	return
}

func (m *BaseFromBloombergIndex) Update(cols []string) (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.Update(m, cols...)
	return
}

func (m *BaseFromBloombergIndex) Del() (err error) {
	o := orm.NewOrmUsingDB("data")
	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
	_, err = o.Raw(sql, m.BaseFromBloombergIndexId).Exec()
	return
}

func (m *BaseFromBloombergIndex) MultiDel(menuIds []int) (err error) {
	if len(menuIds) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("data")
	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
	_, err = o.Raw(sql, menuIds).Exec()
	return
}

func (m *BaseFromBloombergIndex) GetItemById(id int) (item *BaseFromBloombergIndex, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
	err = o.Raw(sql, id).QueryRow(&item)
	return
}

func (m *BaseFromBloombergIndex) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BaseFromBloombergIndex, err error) {
	o := orm.NewOrmUsingDB("data")
	order := ``
	if orderRule != "" {
		order = ` ORDER BY ` + orderRule
	}
	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
	err = o.Raw(sql, pars).QueryRow(&item)
	return
}

func (m *BaseFromBloombergIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
	err = o.Raw(sql, pars).QueryRow(&count)
	return
}

func (m *BaseFromBloombergIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, limit int) (items []*BaseFromBloombergIndex, err error) {
	o := orm.NewOrmUsingDB("data")
	fields := strings.Join(fieldArr, ",")
	if len(fieldArr) == 0 {
		fields = `*`
	}
	order := `ORDER BY create_time DESC`
	if orderRule != "" {
		order = ` ORDER BY ` + orderRule
	}
	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
	if limit > 0 {
		sql += fmt.Sprintf(` LIMIT %d`, limit)
	}
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

func (m *BaseFromBloombergIndex) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BaseFromBloombergIndex, err error) {
	o := orm.NewOrmUsingDB("data")
	fields := strings.Join(fieldArr, ",")
	if len(fieldArr) == 0 {
		fields = `*`
	}
	order := `ORDER BY create_time DESC`
	if orderRule != "" {
		order = ` ORDER BY ` + orderRule
	}
	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

// BaseFromBloombergIndexItem 彭博原始指标信息
type BaseFromBloombergIndexItem struct {
	BaseFromBloombergIndexId int
	IndexCode                string `description:"指标编码"`
	IndexName                string `description:"指标名称"`
	Unit                     string `description:"单位"`
	Source                   int    `description:"数据来源"`
	Frequency                string `description:"频度"`
	StartDate                string `description:"开始日期"`
	EndDate                  string `description:"结束日期"`
	Describe                 string `description:"指标描述"`
	Sort                     int    `description:"排序"`
	IsStop                   int    `description:"是否停更:0-否;1-停更"`
	EdbExist                 int    `description:"指标库是否已添加:0-否;1-是"`
	CreateTime               string `description:"创建时间"`
	ModifyTime               string `description:"修改时间"`
	EdbInfoId                int    `description:"指标库ID"`
	EdbUniqueCode            string `description:"指标库唯一编码"`
	EdbClassifyId            int    `description:"指标库分类ID"`
}

func FormatBaseFromBloombergIndex2Item(origin *BaseFromBloombergIndex) (item *BaseFromBloombergIndexItem) {
	if origin == nil {
		return
	}
	item = new(BaseFromBloombergIndexItem)
	item.BaseFromBloombergIndexId = origin.BaseFromBloombergIndexId
	item.IndexCode = origin.IndexCode
	item.IndexName = origin.IndexName
	item.Unit = origin.Unit
	item.Source = origin.Source
	item.Frequency = origin.Frequency
	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
	item.Describe = origin.Describe
	item.Sort = origin.Sort
	item.IsStop = origin.IsStop
	//item.EdbExist = origin.EdbExist
	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
	return
}

// BloombergSourceListReq 指标列表筛选
type BloombergSourceListReq struct {
	PageSize     int    `form:"PageSize"`
	CurrentIndex int    `form:"CurrentIndex"`
	Frequency    string `form:"Frequency" description:"频度"`
	Keywords     string `form:"Keywords" description:"指标ID/指标名称"`
	ListAll      bool   `form:"ListAll" description:"列表全选"`
	SortField    int    `form:"SortField" description:"排序字段: 0-默认; 1-开始时间; 2-最新时间; 3-更新时间"`
	SortRule     int    `form:"SortRule" description:"排序方式: 0-默认; 1-正序; 2-倒序"`
}

// BloombergSourceListResp 指标列表响应体
type BloombergSourceListResp struct {
	List   []*BaseFromBloombergIndexItem
	Paging *paging.PagingItem `description:"分页数据"`
}

// UpdateEdbExist 标记已添加指标库
func (m *BaseFromBloombergIndex) UpdateEdbExist(indexCode string) (err error) {
	o := orm.NewOrmUsingDB("data")
	sql := fmt.Sprintf(`UPDATE %s SET %s = ? WHERE %s = ? LIMIT 1`, m.TableName(), BaseFromBloombergIndexCols.EdbExist, BaseFromBloombergIndexCols.IndexCode)
	_, err = o.Raw(sql, 1, indexCode).Exec()
	return
}

// BloombergSourceBatchAddCheckReq Bloomberg批量添加校验
type BloombergSourceBatchAddCheckReq struct {
	BloombergSourceListReq
	IndexCodes []string `form:"IndexCodes" description:"全选为false时, 该数组为选中; 全选为true时, 该数组为不选的指标"`
}

// --------------------------------------------- 以下为测试用 ---------------------------------------------

// BaseFromBloombergData 彭博原始指标表
//type BaseFromBloombergData struct {
//	BaseFromBloombergDataId  int       `orm:"column(base_from_bloomberg_data_id);pk"`
//	BaseFromBloombergIndexId int       `description:"指标ID"`
//	IndexCode                string    `description:"指标编码"`
//	DataTime                 time.Time `description:"数据日期"`
//	Value                    float64   `description:"数据值"`
//	CreateTime               time.Time `description:"创建时间"`
//	ModifyTime               time.Time `description:"修改时间"`
//	DataTimestamp            int       `description:"数据日期时间戳"`
//}
//
//func (m *BaseFromBloombergData) TableName() string {
//	return "base_from_bloomberg_data"
//}
//
//func (m *BaseFromBloombergData) Create() (err error) {
//	o := orm.NewOrmUsingDB("data")
//	id, err := o.Insert(m)
//	if err != nil {
//		return
//	}
//	m.BaseFromBloombergDataId = int(id)
//	return
//}
//
//func (m *BaseFromBloombergData) CreateMulti(items []*BaseFromBloombergData) (err error) {
//	if len(items) == 0 {
//		return
//	}
//	o := orm.NewOrmUsingDB("data")
//	_, err = o.InsertMulti(len(items), items)
//	return
//}