package models

import (
	"mtp2_if/db"
	"time"
)

// Accounttradeconfig 账户交易参数配置表
type Accounttradeconfig struct {
	Autoid       int64     `json:"autoid"  xorm:"'AUTOID'" binding:"required"`       // 自增ID
	Accountid    int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 资金账号
	Userid       int64     `json:"userid"  xorm:"'USERID'"`                          // 用户ID
	Memberuserid int64     `json:"memberuserid"  xorm:"'MEMBERUSERID'"`              // 所属会员ID
	Goodsid      int32     `json:"goodsid"  xorm:"'GOODSID'"`                        // 商品ID
	Marketid     int32     `json:"marketid"  xorm:"'MARKETID'"`                      // 市场ID
	Ruletype     int32     `json:"ruletype"  xorm:"'RULETYPE'"`                      // 参数类型 -1.保证金类 2.交易规则 3.交易费用
	Paramid      int32     `json:"paramid"  xorm:"'PARAMID'"`                        // 个性化参数ID - 1. 参照"交易模式规则费用对应-参考表" 可个性化类型 2.保证金类保存交易所创建的投资者客户类别ID
	Feealgorithm int32     `json:"feealgorithm"  xorm:"'FEEALGORITHM'"`              // 费用算法 - 1：比率 2：固定
	Paramvalue   float64   `json:"paramvalue"  xorm:"'PARAMVALUE'"`                  // 参数值(保证金类此项为空)
	Createtime   time.Time `json:"createtime"  xorm:"'CREATETIME'"`                  // 创建时间
	Creatorid    int64     `json:"creatorid"  xorm:"'CREATORID'"`                    // 创建人
	Tradetype    int32     `json:"tradetype"  xorm:"'TRADETYPE'"`                    // 交易类型[交易费用] - 1:投资者\自营 2:做市
}

// TableName is ACCOUNTTRADECONFIG
func (Accounttradeconfig) TableName() string {
	return "ACCOUNTTRADECONFIG"
}

// Usergrouptradeconfig 用户分组交易参数配置表 (个性化到用户分组或资金账号)
type Usergrouptradeconfig struct {
	Autoid       int64     `json:"autoid"  xorm:"'AUTOID'" binding:"required"`           // 自增ID
	Usergroupid  int64     `json:"usergroupid"  xorm:"'USERGROUPID'" binding:"required"` // 用户分组ID(0的为会员默认设置)
	Memberuserid int64     `json:"memberuserid"  xorm:"'MEMBERUSERID'"`                  // 所属会员ID
	Goodsid      int32     `json:"goodsid"  xorm:"'GOODSID'"`                            // 商品ID
	Marketid     int32     `json:"marketid"  xorm:"'MARKETID'"`                          // 市场ID
	Ruletype     int32     `json:"ruletype"  xorm:"'RULETYPE'"`                          // 参数类型 -1.保证金类 2.交易规则 3.交易费用
	Paramid      int32     `json:"paramid"  xorm:"'PARAMID'"`                            // 个性化参数ID - 1. 参照"交易模式规则费用对应-参考表" 可个性化类型 2.保证金类保存交易所创建的投资者客户类别ID
	Feealgorithm int32     `json:"feealgorithm"  xorm:"'FEEALGORITHM'"`                  // 费用算法 - 1：比率 2：固定
	Paramvalue   float64   `json:"paramvalue"  xorm:"'PARAMVALUE'"`                      // 参数值(保证金类此项为空)
	Createtime   time.Time `json:"createtime"  xorm:"'CREATETIME'"`                      // 创建时间
	Creatorid    int64     `json:"creatorid"  xorm:"'CREATORID'"`                        // 创建人
}

// TableName is USERGROUPTRADECONFIG
func (Usergrouptradeconfig) TableName() string {
	return "USERGROUPTRADECONFIG"
}

// Goodstraderule 商品交易规则表
type Goodstraderule struct {
	Goodsid    int32   `json:"goodsid"  xorm:"'GOODSID'" binding:"required"`       // 商品ID
	Ruleid     int32   `json:"ruleid"  xorm:"'RULEID'" binding:"required"`         // 交易规则 - 101 最大买持仓量  102 最大卖持仓量 103 单笔最小建仓量 104 单笔最大建仓量 105 手续费收费规则 106 交易T+N 107 上市首日涨停 108 上市首日跌停 109 上市首日参考价 110 涨停 111 跌停 112 市价最大偏移范围 113 止损点差 114 止盈点差 115 单笔最小交割数量 116 单笔最大交割数量
	Paramvalue float64 `json:"paramvalue"  xorm:"'PARAMVALUE'" binding:"required"` // 参数值
	Marketid   int32   `json:"marketid"  xorm:"'MARKETID'"`                        // 市场ID
}

// TableName is GOODSTRADERULE
func (Goodstraderule) TableName() string {
	return "GOODSTRADERULE"
}

// Goodstradefee 商品交易费用表
type Goodstradefee struct {
	Goodsid            int32   `json:"goodsid"  xorm:"'GOODSID'" binding:"required"`                       // 商品ID
	Tradefeeid         int32   `json:"tradefeeid"  xorm:"'TRADEFEEID'" binding:"required"`                 // 交易费用ID - 101建仓(买)手续费 102平仓(卖)手续费 103买递延费(仓储费) 103卖递延费 104买交割手续费 105卖交割手续费
	Feealgorithm       int32   `json:"feealgorithm"  xorm:"'FEEALGORITHM'" binding:"required"`             // 费用算法 - 1：比率 2：固定
	Exchangevalue      float64 `json:"exchangevalue"  xorm:"'EXCHANGEVALUE'" binding:"required"`           // 交易所费用值
	Memberdefaultvalue float64 `json:"memberdefaultvalue"  xorm:"'MEMBERDEFAULTVALUE'" binding:"required"` // 会员费用默认值
	Memberminvalue     float64 `json:"memberminvalue"  xorm:"'MEMBERMINVALUE'"`                            // 会员费用最小值
	Membermaxvalue     float64 `json:"membermaxvalue"  xorm:"'MEMBERMAXVALUE'"`                            // 会员费用最大值
	Marketid           int32   `json:"marketid"  xorm:"'MARKETID'"`                                        // 市场ID
}

// TableName is GOODSTRADEFEE
func (Goodstradefee) TableName() string {
	return "GOODSTRADEFEE"
}

// Goodsgrouptraderule 商品组交易规则表
type Goodsgrouptraderule struct {
	Goodsgroupid int32   `json:"goodsgroupid"  xorm:"'GOODSGROUPID'" binding:"required"` // 商品组ID
	Ruleid       int32   `json:"ruleid"  xorm:"'RULEID'" binding:"required"`             // 交易规则 - 101 最大买持仓量  102 最大卖持仓量 103 单笔最小建仓量 104 单笔最大建仓量 105 手续费收费规则 106 交易T+N 107 上市首日涨停 108 上市首日跌停 109 上市首日参考价 110 涨停 111 跌停 112 市价最大偏移范围 113 止损点差 114 止盈点差 115 单笔最小交割数量 116 单笔最大交割数量
	Paramvalue   float64 `json:"paramvalue"  xorm:"'PARAMVALUE'" binding:"required"`     // 参数值
	Marketid     int32   `json:"marketid"  xorm:"'MARKETID'"`                            // 市场ID
}

// TableName is GOODSGROUPTRADERULE
func (Goodsgrouptraderule) TableName() string {
	return "GOODSGROUPTRADERULE"
}

// Goodsgrouptradefee 商品组交易费用表
type Goodsgrouptradefee struct {
	Goodsgroupid       int32   `json:"goodsgroupid"  xorm:"'GOODSGROUPID'" binding:"required"`             // 商品组ID
	Tradefeeid         int32   `json:"tradefeeid"  xorm:"'TRADEFEEID'" binding:"required"`                 // 交易费用ID - 101建仓(买)手续费 102平仓(卖)手续费 103买递延费(仓储费) 103卖递延费 104买交割手续费 105卖交割手续费
	Feealgorithm       int32   `json:"feealgorithm"  xorm:"'FEEALGORITHM'" binding:"required"`             // 费用算法 - 1：比率 2：固定
	Exchangevalue      float64 `json:"exchangevalue"  xorm:"'EXCHANGEVALUE'" binding:"required"`           // 交易所费用值
	Memberdefaultvalue float64 `json:"memberdefaultvalue"  xorm:"'MEMBERDEFAULTVALUE'" binding:"required"` // 会员费用默认值
	Memberminvalue     float64 `json:"memberminvalue"  xorm:"'MEMBERMINVALUE'"`                            // 会员费用最小值
	Membermaxvalue     float64 `json:"membermaxvalue"  xorm:"'MEMBERMAXVALUE'"`                            // 会员费用最大值
	Marketid           int32   `json:"marketid"  xorm:"'MARKETID'"`                                        // 市场ID
}

// TableName is GOODSGROUPTRADEFEE
func (Goodsgrouptradefee) TableName() string {
	return "GOODSGROUPTRADEFEE"
}

// Goodsmarginconfig 商品保证金配置表
type Goodsmarginconfig struct {
	Goodsid             int32   `json:"goodsid"  xorm:"'GOODSID'" binding:"required"`               // 商品ID
	Customertypeid      int64   `json:"customertypeid"  xorm:"'CUSTOMERTYPEID'" binding:"required"` // 投资者客户类别(枚举项的值)
	Marginalgorithm     int32   `json:"marginalgorithm"  xorm:"'MARGINALGORITHM'"`                  // 保证金计算方式 - 1:比率 2.固定
	Marketmarginvalue   float64 `json:"marketmarginvalue"  xorm:"'MARKETMARGINVALUE'"`              // 即市保证金值
	Reckonmarginvalue   float64 `json:"reckonmarginvalue"  xorm:"'RECKONMARGINVALUE'"`              // 结算保证金值
	Lockmarginvalue     float64 `json:"lockmarginvalue"  xorm:"'LOCKMARGINVALUE'"`                  // 锁仓保证金
	Isdefault           int32   `json:"isdefault"  xorm:"'ISDEFAULT'"`                              // 是否默认 - 0:非默认  1：默认
	Marketid            int32   `json:"marketid"  xorm:"'MARKETID'"`                                // 市场ID
	Realmarginvalue     float64 `json:"realmarginvalue"  xorm:"'REALMARGINVALUE'"`                  // 实付保证金值[做市收益权市场“是否交易授信” = 1 ]
	Realmarginalgorithm int32   `json:"realmarginalgorithm"  xorm:"'REALMARGINALGORITHM'"`          // 实付保证金计算方式 - 1:比率 2.固定
}

// TableName is GOODSMARGINCONFIG
func (Goodsmarginconfig) TableName() string {
	return "GOODSMARGINCONFIG"
}

// Todayaccounttraderule 今日账户交易规则信表 控制服务在待开市时清空表，然后从基础数表生成数据，各服务使用此表数据做为当天交易参数，当日修改的数据隔日生效
type Todayaccounttraderule struct {
	Accountid   int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 账号ID
	Goodsid     int32     `json:"goodsid"  xorm:"'GOODSID'" binding:"required"`     // 商品ID
	Infocontent string    `json:"infocontent"  xorm:"'INFOCONTENT'"`                // 交易规则信息(存储配置的Protobuffer串)
	Marketid    int32     `json:"marketid"  xorm:"'MARKETID'"`                      // 市场ID
	Createdate  time.Time `json:"createdate"  xorm:"'CREATEDATE'"`                  // 创建时间
	Tradetype   int32     `json:"tradetype"  xorm:"'TRADETYPE'" binding:"required"` // 交易类型 - 1:投资者\自营 2:做市
}

// TableName is TODAY_ACCOUNTTRADERULE
func (Todayaccounttraderule) TableName() string {
	return "TODAY_ACCOUNTTRADERULE"
}

// GetTodayAccountTradeRule 获取今日账户交易规则信息
func GetTodayAccountTradeRule(accountID, goodsID int) (*Todayaccounttraderule, error) {
	engine := db.GetEngine()

	var rule Todayaccounttraderule
	var has bool
	var err error

	// 先尝试获取账户定制配置
	if accountID > 0 {
		has, err = engine.Where("ACCOUNTID = ?", accountID).And("TRADETYPE = 1 and GOODSID = ?", goodsID).Get(&rule)
		if err != nil {
			return nil, err
		}
	}

	// 无定制配置则取通用配置（accountID = 0）
	if !has {
		has, err = engine.Where("TRADETYPE = 1 and ACCOUNTID = 0 and GOODSID = ?", goodsID).Get(&rule)
		if err != nil {
			return nil, err
		}
	}

	if !has {
		// 无配置信息
		return nil, nil
	}

	return &rule, nil
}
