package data_source

import (
	"github.com/beego/beego/v2/client/orm"
	"time"
)

type BaseFromTradeGuangzhouClassify struct {
	BaseFromTradeGuangzhouClassifyId int       `orm:"column(base_from_trade_guangzhou_classify_id);pk"`
	ClassifyName                     string    `description:"分类名称"`
	ClassifyCode                     string    `description:"分类编码"`
	ParentId                         int       `description:"分类父级id"`
	ModifyTime                       time.Time `description:"修改时间"`
	CreateTime                       time.Time `description:"创建时间"`
}

type BaseFromTradeGuangzhouIndex struct {
	BaseFromTradeGuangzhouIndexId    int       `orm:"column(base_from_trade_guangzhou_index_id);pk"`
	BaseFromTradeGuangzhouClassifyId int       `description:"分类id"`
	IndexCode                        string    `description:"指标编码"`
	IndexName                        string    `description:"指标名称"`
	Frequency                        string    `description:"频率"`
	Unit                             string    `description:"单位"`
	StartDate                        string    `description:"开始日期"`
	EndDate                          string    `description:"结束日期"`
	CreateTime                       time.Time `description:"创建日期"`
	ModifyTime                       time.Time `description:"修改日期"`
}

type BaseFromTradeGuangzhouData struct {
	BaseFromTradeGuangzhouDataId  int       `orm:"column(base_from_trade_guangzhou_data_id);pk"`
	BaseFromTradeGuangzhouIndexId int       `description:"指标id"`
	IndexCode                     string    `description:"指标编码"`
	DataTime                      string    `description:"数据日期"`
	Value                         float64   `description:"数据值"`
	QtySub                        float64   `description:"增减"`
	CreateTime                    time.Time `description:"创建日期"`
	ModifyTime                    time.Time `description:"修改日期"`
}

type BaseFromTradeGuangzhouClassifyView struct {
	BaseFromTradeGuangzhouClassifyId int    `orm:"column(base_from_trade_guangzhou_classify_id);pk"`
	ClassifyName                     string `description:"分类名称"`
	ClassifyCode                     string `description:"分类编码"`
	ParentId                         int    `description:"分类父级id"`
	Children                         []*BaseFromTradeGuangzhouClassifyView
}

type BaseFromTradeGuangzhouContract struct {
	BaseFromTradeGuangzhouContractId int    `orm:"column(base_from_trade_guangzhou_contract_id);pk"`
	BaseFromTradeGuangzhouClassifyId int    `description:"分类id"`
	ClassifyCode                     string `description:"分类编码"`
	Contract                         string `description:"合约编码"`
	TradeDate                        string `description:"合约日期"`
}

func (obj *BaseFromTradeGuangzhouIndex) GetBaseFromTradeGuangzhouClassifyAll() (list []*BaseFromTradeGuangzhouClassifyView, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT * FROM base_from_trade_guangzhou_classify`
	_, err = o.Raw(sql).QueryRows(&list)
	return list, err
}

func (obj *BaseFromTradeGuangzhouIndex) GetBaseFromTradeGuangzhouMaxDate() (max_date string, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT MAX(a.end_date) AS max_date FROM base_from_trade_guangzhou_index AS a `
	err = o.Raw(sql).QueryRow(&max_date)
	return max_date, err
}

func (obj *BaseFromTradeGuangzhouIndex) GetBaseFromTradeGuangzhouContract(classifyId int, tradeDate string) (list []*BaseFromTradeGuangzhouContract, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT * FROM base_from_trade_guangzhou_contract AS a WHERE base_from_trade_guangzhou_classify_id=? AND trade_date=? `
	_, err = o.Raw(sql, classifyId, tradeDate).QueryRows(&list)
	return
}

type BaseFromTradeGuangzhouIndexView struct {
	BaseFromTradeGuangzhouIndexId    int     `description:"指标id"`
	BaseFromTradeGuangzhouClassifyId int     `description:"分类id"`
	IndexCode                        string  `description:"指标编码"`
	IndexName                        string  `description:"指标名称"`
	Frequency                        string  `description:"频率"`
	Unit                             string  `description:"单位"`
	StartDate                        string  `description:"开始日期"`
	EndDate                          string  `description:"结束日期"`
	Value                            float64 `description:"数据"`
}

func (obj *BaseFromTradeGuangzhouIndex) GetBaseFromTradeGuangzhouIndex(condition string, pars []interface{}, baseFromTradeGuangzhouContractId int) (list []*BaseFromTradeGuangzhouIndexView, err error) {
	o := orm.NewOrmUsingDB("data")
	if baseFromTradeGuangzhouContractId <= 0 {
		sql := ` SELECT b.base_from_trade_guangzhou_index_id,b.index_code,b.index_name,b.unit,b.frequency,b.start_date,b.end_date,a.value,c.base_from_trade_guangzhou_contract_id 
 FROM base_from_trade_guangzhou_data AS a
INNER JOIN base_from_trade_guangzhou_index AS b ON a.base_from_trade_guangzhou_index_id=b.base_from_trade_guangzhou_index_id
LEFT JOIN base_from_trade_guangzhou_contract AS c ON b.base_from_trade_guangzhou_classify_id=c.base_from_trade_guangzhou_classify_id
WHERE `
		if condition != "" {
			sql += condition
		}
		sql += ` ORDER BY a.index_code ASC `
		_, err = o.Raw(sql, pars).QueryRows(&list)
		return
	} else {
		condition += ` AND a.base_from_trade_guangzhou_contract_id=? `
		pars = append(pars, baseFromTradeGuangzhouContractId)

		sql := ` SELECT a.*,b.value 
 FROM base_from_trade_guangzhou_index AS a
INNER JOIN base_from_trade_guangzhou_data AS b ON a.base_from_trade_guangzhou_index_id=b.base_from_trade_guangzhou_index_id
WHERE `

		if condition != "" {
			sql += condition
		}
		sql += ` ORDER BY a.index_code ASC `
		_, err = o.Raw(sql, pars).QueryRows(&list)
		return
	}
}

func (obj *BaseFromTradeGuangzhouIndex) GetBaseFromTradeGuangzhouIndexDetail(condition string, pars []interface{}) (list []*BaseFromTradeGuangzhouIndexView, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT a.*
 FROM base_from_trade_guangzhou_index AS a
WHERE `

	if condition != "" {
		sql += condition
	}
	sql += ` ORDER BY a.index_code ASC `
	_, err = o.Raw(sql, pars).QueryRows(&list)
	return
}