/**
* @Author: zou.yingbin
* @Create  : 2021/1/26 13:42
* @Modify  : 2021/1/26 13:42
 */

package models

import (
	"fmt"
	"mtp2_if/db"
	"mtp2_if/logger"
	"mtp2_if/mtpcache"
)

// ErmcpMiddleGoodsModel 套保品种
type ErmcpMiddleGoodsModel struct {
	MIDDLEGOODSID      uint32  `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"`           // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
	MIDDLEGOODSNAME    string  `json:"middlegoodsname"  xorm:"'MIDDLEGOODSNAME'"`       // 套保品种名称
	MIDDLEGOODSCODE    string  `json:"middlegoodscode"  xorm:"'MIDDLEGOODSCODE'"`       // 套保品种代码
	GOODSUNITID        int32   `json:"goodsunitid"  xorm:"'GOODSUNITID'"`               // 单位ID
	RELATEDGOODSID     int32   `json:"relatedgoodsid"  xorm:"'RELATEDGOODSID'"`         // 关联交易商品ID
	EVALUATERATIO      float64 `json:"evaluateratio"  xorm:"'EVALUATERATIO'"`           // 估价系数
	QTYDECIMALPLACE    int32   `json:"qtydecimalplace"  xorm:"'QTYDECIMALPLACE'"`       // 数量小数位
	RELATEDGOODSTYPE   int32   `json:"relatedgoodstype"  xorm:"'RELATEDGOODSTYPE'"`     // 关联商品类型 - 1:期货合约 2:现货品种
	NEEDHEDGERATIO     float64 `json:"needhedgeratio"  xorm:"'NEEDHEDGERATIO'"`         // 套保比率
	NEEDARBITRAGERATIO float64 `json:"needarbitrageratio"  xorm:"'NEEDARBITRAGERATIO'"` // 套利比例
	AREAUSERID         int64   `json:"areauserid"  xorm:"'AREAUSERID'"`                 // 机构用户ID
	GOODSGROUPID       int32   `json:"goodsgroupid"  xorm:"'GOODSGROUPID'"`             // 关联期货品种ID
	ISVALID            int32   `json:"isvalid"  xorm:"'ISVALID'"`                       // 状态 0-无效(停用) 1-有效(正常)
	MODIFYTIME         string  `json:"modifytime"  xorm:"'MODIFYTIME'"`                 // 修改时间
	CREATETIME         string  `json:"createtime"  xorm:"'CREATETIME'"`                 // 修改时间
	REMARK             string  `json:"remark"  xorm:"'REMARK'"`                         // 备注
	ENUMDICNAME        string  `json:"enumdicname"`                                     // 单位名称
}

func (r *ErmcpMiddleGoodsModel) Calc() {
	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
}

// GetData 获取套保品种数据
func (r *ErmcpMiddleGoodsModel) GetData() ([]interface{}, error) {
	sData := make([]ErmcpMiddleGoodsModel, 0)
	if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err != nil {
		logger.GetLogger().Error(err)
		return nil, err
	}
	iData := make([]interface{}, 0)
	for i := range sData {
		iData = append(iData, &sData[i])
	}
	return iData, nil
}

// GetData2 获取套保品种数据2
func (r *ErmcpMiddleGoodsModel) GetData2() ([]ErmcpMiddleGoodsModel, error) {
	sData := make([]ErmcpMiddleGoodsModel, 0)
	if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err != nil {
		logger.GetLogger().Error(err)
		return nil, err
	}
	for i := range sData {
		sData[i].Calc()
	}
	return sData, nil
}

func (r *ErmcpMiddleGoodsModel) buildSql() string {
	sqlId := "select MIDDLEGOODSID," +
		"       MIDDLEGOODSNAME," +
		"       MIDDLEGOODSCODE," +
		"       GOODSUNITID," +
		"       RELATEDGOODSID," +
		"       EVALUATERATIO," +
		"       QTYDECIMALPLACE," +
		"       RELATEDGOODSTYPE," +
		"       NEEDHEDGERATIO," +
		"       NEEDARBITRAGERATIO," +
		"       AREAUSERID," +
		"       GOODSGROUPID," +
		"       to_char(MODIFYTIME, 'yyyy-mm-dd hh24:mi:ss') MODIFYTIME," +
		"       to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME," +
		"       ISVALID," +
		"       REMARK" +
		"  from erms_middlegoods t" +
		"  where 1=1 "
	if r.AREAUSERID > 0 {
		sqlId = sqlId + fmt.Sprintf(" and AREAUSERID = %v", r.AREAUSERID)
	}
	if r.ISVALID >= 0 {
		sqlId = sqlId + fmt.Sprintf(" and ISVALID=%v", r.ISVALID)
	}
	if r.MIDDLEGOODSID > 0 {
		sqlId = sqlId + fmt.Sprintf(" and MIDDLEGOODSID=%v", r.MIDDLEGOODSID)
	}
	sqlId += " order by t.createtime desc"
	return sqlId
}

// ErmcpMiddleGoodsDetail 套保品种详情
type ErmcpMiddleGoodsDetail struct {
	Mg      ErmcpMiddleGoodsModel // 套保品种基本信息
	CvList  []ErmcpGGConvertCfg   // 期货品种折算列表
	WrcList []WRSConverTDetail    // 现货品种列表(现货商品折算配置)
}

// GetData 获取套保品种详情
func (r *ErmcpMiddleGoodsDetail) GetData() ([]ErmcpMiddleGoodsDetail, error) {
	rsp := make([]ErmcpMiddleGoodsDetail, 0)
	// 查基本信息
	m := ErmcpMiddleGoodsModel{AREAUSERID: r.Mg.AREAUSERID, MIDDLEGOODSID: r.Mg.MIDDLEGOODSID, ISVALID: -1}
	d, err := m.GetData2()
	if err != nil || len(d) == 0 {
		return rsp, fmt.Errorf("no record")
	}
	for i := range d {
		val := ErmcpMiddleGoodsDetail{Mg: d[i],
			CvList:  make([]ErmcpGGConvertCfg, 0),
			WrcList: make([]WRSConverTDetail, 0),
		}
		rsp = append(rsp, val)
	}
	// 查折算表
	md := ErmcpGGConvertCfg{}
	if ggc, err := md.GetData2(); err == nil {
		for i := range rsp {
			for k := range ggc {
				if rsp[i].Mg.GOODSGROUPID == ggc[k].Destgoodsgroupid {
					rsp[i].CvList = append(rsp[i].CvList, ggc[k])
				}
			}
		}
	}

	// 查现货商品折算配置明细表
	mWc := WRSConverTDetail{}
	if wc, err := mWc.GetData(); err == nil {
		for i := range rsp {
			for k := range wc {
				if int64(rsp[i].Mg.MIDDLEGOODSID) == wc[k].MIDDLEGOODSID {
					rsp[i].WrcList = append(rsp[i].WrcList, wc[k])
				}
			}
		}
	}

	return rsp, nil
}

// ErmcpMiddleGoodsChangeLog 套保品种变更记录
type ErmcpMiddleGoodsChangeLog struct {
	LOGID         int64   `json:"logid"  xorm:"'LOGID'"`                 // 流水ID
	MIDDLEGOODSID int     `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"` // 套保品种ID
	CHANGELOGTYPE int32   `json:"changelogtype"  xorm:"'CHANGELOGTYPE'"` // 变更流水类型 - 1:套保比率变更
	BEFOREVALUE   float64 `json:"beforevalue"  xorm:"'BEFOREVALUE'"`     // 变更前
	AFTERVALUE    float64 `json:"aftervalue"  xorm:"'AFTERVALUE'"`       // 变更后
	LOGDATETIME   string  `json:"logdatetime"  xorm:"'LOGDATETIME'"`     // 流水日期
	LOGREMARK     string  `json:"logremark"  xorm:"'LOGREMARK'"`         // 流水备注
	HANDLESTATUS  int32   `json:"handlestatus"  xorm:"'HANDLESTATUS'"`   // 处理状态
	TRADEDATE     string  `json:"tradedate"  xorm:"'TRADEDATE'"`         // 交易日(yyyyMMdd)
	UPDATETIME    string  `json:"updatetime"  xorm:"'UPDATETIME'"`       // 更新时间
	APPLYSRC      int32   `json:"applysrc"  xorm:"'APPLYSRC'"`           // 操作来源 - 1:管理端 2:终端
	APPLYID       int64   `json:"applyid"  xorm:"'APPLYID'"`             // 操作人
	APPLYNAME     string  `json:"applyname"`                             // 操作人名称
}

func (r *ErmcpMiddleGoodsChangeLog) buildSql() string {
	sqlId := "SELECT LOGID," +
		"       MIDDLEGOODSID," +
		"       CHANGELOGTYPE," +
		"       BEFOREVALUE," +
		"       AFTERVALUE," +
		"       to_char(LOGDATETIME, 'yyyy-mm-dd hh24:mi:ss') LOGDATETIME," +
		"       LOGREMARK," +
		"       HANDLESTATUS," +
		"       TRADEDATE," +
		"       to_char(UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
		"       APPLYSRC," +
		"       APPLYID" +
		"  FROM ermcp_mgchangelog" +
		" WHERE 1 = 1"
	if r.MIDDLEGOODSID > 0 {
		sqlId = sqlId + fmt.Sprintf(" and MIDDLEGOODSID=%v", r.MIDDLEGOODSID)
	}
	return sqlId
}

// Calc 处理要转换的数据
func (r *ErmcpMiddleGoodsChangeLog) Calc() {
	r.APPLYNAME = mtpcache.GetUserNameByUserId(r.APPLYID)
	if r.APPLYNAME == "" {
		// APPLYID 原来数据库存的是userid, 后来又改为loginid
		// 当为loginid时，获取logincode
		r.APPLYNAME = mtpcache.GetLoginCodeByLoginId(r.APPLYID)
	}
}

// GetDataEx 获取套保变更操作数据
func (r *ErmcpMiddleGoodsChangeLog) GetDataEx() (interface{}, error) {
	sData := make([]ErmcpMiddleGoodsChangeLog, 0)
	if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err != nil {
		return nil, err
	}
	for i := range sData {
		sData[i].Calc()
	}
	return sData, nil
}
