package yu_okx

import yu_strconv "gogs.qqck.cn/s/tools/strconv"

type EcotradePublicTrade_expert_rate struct {
	DataVersion string `json:"dataVersion"`
	Pages       int    `json:"pages"`
	Ranks       []struct {
		FansNum      string `json:"fansNum"`
		FollowStatus string `json:"followStatus"`
		LongLever    string `json:"longLever"`
		MaxRetreat   string `json:"maxRetreat"`
		NickName     string `json:"nickName"`
		Portrait     string `json:"portrait"`
		Rates        []struct {
			Ratio    string `json:"ratio"`
			StatTime string `json:"statTime"`
		} `json:"rates"`
		RiskLevel        string `json:"riskLevel"`
		RoleType         string `json:"roleType"`
		ShortLever       string `json:"shortLever"`
		SignalRoleType   string `json:"signalRoleType"`
		SpotRoleType     string `json:"spotRoleType"`
		StrategyRoleType string `json:"strategyRoleType"`
		TargetId         string `json:"targetId"`
		UniqueName       string `json:"uniqueName"`
		YieldRate        string `json:"yieldRate"`
	} `json:"ranks"`
	Total int `json:"total"`
}

// EcotradePublicTrade_expert_rate
//
//	@Description: 获取牛人榜
//	@param size 分页大小
//	@param num 页数索引，从 1 开始
func (t *V5Priapi) EcotradePublicTrade_expert_rate(size string, num string) []*EcotradePublicTrade_expert_rate {
	j_path, j_resp := "/priapi/v5/ecotrade/public/trade-expert-rate?size="+size+"&num="+num+"&sort=desc", make([]*EcotradePublicTrade_expert_rate, 0)
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}

type EcotradePublicPosition_summary struct {
	AvailSubPos       string `json:"availSubPos"` // 持仓量
	Ccy               string `json:"ccy"`         // 币种(保证金币种？)
	ClosePnl          string `json:"closePnl"`
	DealVolume        string `json:"dealVolume"`
	DetailIds         string `json:"detailIds"`      // 开仓明细IDs
	Fee               string `json:"fee"`            // 累计手续费金额，正数代表平台返佣 ，负数代表平台扣除
	FundingFee        string `json:"fundingFee"`     // 累计资金费用(已实现收益 = fundingFee + fee)
	Imr               string `json:"imr"`            // 保证金
	InstId            string `json:"instId"`         // 产品ID
	InstType          string `json:"instType"`       // 产品类型，MARGIN：币币杠杆，SWAP：永续合约，FUTURES：交割合约，OPTION：期权
	Last              string `json:"last"`           // 最新成交价
	Lever             string `json:"lever"`          // 杠杆倍数
	LiquidationFee    string `json:"liquidationFee"` // 强平价？
	Margin            string `json:"margin"`
	MarkPx            string `json:"markPx"`            // 最新标记价格
	MaxSellableAmount string `json:"maxSellableAmount"` // 最大可卖出张数
	MgnMode           string `json:"mgnMode"`           // 保证金模式，cross：全仓，isolated：逐仓
	NotionalUsd       string `json:"notionalUsd"`
	OpenAvgPx         string `json:"openAvgPx"`   // 开仓均价
	OpenTime          string `json:"openTime"`    // 开仓时间
	Pnl               string `json:"pnl"`         // 浮动收益额
	PnlRatio          string `json:"pnlRatio"`    // 浮动收益率
	PosSide           string `json:"posSide"`     // 持仓方向，long：开平仓模式开多，pos为正，short：开平仓模式开空，pos为正，net：买卖模式（交割/永续/期权：pos为正代表开多，pos为负代表开空。币币杠杆时，pos均为正，posCcy为交易货币时，代表开多；posCcy为计价货币时，代表开空。）
	PosType           string `json:"posType"`     // 限仓类型，仅适用于组合保证金模式下的期权全仓。1：所有合约挂单 + 持仓张数，2：所有合约总挂单张数，3：所有合约总挂单单数，4：同方向合约挂单 + 持仓张数，5：单一合约总挂单单数，6：单一合约挂单 + 持仓张数，7：单笔挂单张数"
	Side              string `json:"side"`        // 订单方向，buy：买， sell：卖
	SubPos            string `json:"subPos"`      // 持仓张数
	TradeItemId       string `json:"tradeItemId"` // 贸易项目Id
	UTime             string `json:"uTime"`       // 账户信息的更新时间，Unix时间戳的毫秒数格式，如 1718092801068
	UniqueName        string `json:"uniqueName"`
}

// EcotradePublicPosition_summary
//
//	@Description: 获取当前带单
//	@param uniqueName 唯一名称
func (t *V5Priapi) EcotradePublicPosition_summary(instType InstType, uniqueName string) []*EcotradePublicPosition_summary {
	j_path, j_resp := "/priapi/v5/ecotrade/public/position-summary?instType="+string(instType)+"&uniqueName="+uniqueName, make([]*EcotradePublicPosition_summary, 0)
	// {"code":"0","data":[{"availSubPos":"4000","ccy":"USDT","closePnl":"0","dealVolume":"","detailIds":"717132209086603264,717014968487714816","fee":"-0.7604","fundingFee":"-19.1201044437776822","imr":"331.12","instId":"YGG-USDT-SWAP","instType":"SWAP","last":"0.8282","lever":"10","liquidationFee":"0","margin":"380.2","markPx":"0.8278","maxSellableAmount":"4000","mgnMode":"cross","notionalUsd":"3310.86888","openAvgPx":"0.9505","openTime":"1717221689981","pnl":"-490.8","pnlRatio":"-1.290899526564966","posSide":"long","posType":"3","side":"buy","subPos":"4000","tradeItemId":"667789928084258856_0","uTime":"1718092801068","uniqueName":"316EB79577E71F64"},{"availSubPos":"3700","ccy":"USDT","closePnl":"0","dealVolume":"","detailIds":"720572316288360448,719194196712955904,698994152353374208,698986384095518720,698636000462184448","fee":"-2.0872758","fundingFee":"382.0574740996549147","imr":"265.253","instId":"AEVO-USDT-SWAP","instType":"SWAP","last":"0.7166","lever":"10","liquidationFee":"0","margin":"563.55","markPx":"0.7169","maxSellableAmount":"0","mgnMode":"cross","notionalUsd":"2652.264747","openAvgPx":"1.5231081081081081","openTime":"1712839802539","pnl":"-2982.97","pnlRatio":"-5.293177180374412","posSide":"long","posType":"3","side":"buy","subPos":"3700","tradeItemId":"690123857071951872_0","uTime":"1718092805289","uniqueName":"316EB79577E71F64"}],"msg":""}
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}

type EcotradePublicasset struct {
	Currency string `json:"currency"` // 币种
	Percent  string `json:"percent"`  // 百分比
}

// EcotradePublicAsset
//
//	@Description: 获取投资组合
//	@param uniqueName 唯一名称
func (t *V5Priapi) EcotradePublicAsset(uniqueName string) []*EcotradePublicasset {
	j_path, j_resp := "/priapi/v5/ecotrade/public/asset?uniqueName="+uniqueName, make([]*EcotradePublicasset, 0)
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}

type EcotradePublicPositions struct {
	Alias    string `json:"alias"`
	AvgPx    string `json:"avgPx"`    // 开仓平均价
	CTime    string `json:"cTime"`    // 持仓创建时间，Unix时间戳的毫秒数格式，如 1597026383085
	InstId   string `json:"instId"`   // 产品ID
	InstType string `json:"instType"` // 产品类型，MARGIN：币币杠杆，SWAP：永续合约，FUTURES：交割合约，OPTION：期权
	Lever    string `json:"lever"`    // 杠杆倍数
	LiqPx    string `json:"liqPx"`    // 预估强平价，不适用于期权
	MgnMode  string `json:"mgnMode"`  // 保证金模式，cross：全仓，isolated：逐仓
	Pos      string `json:"pos"`      // 以张为单位的持仓数量
	PosCcy   string `json:"posCcy"`   // 仓位资产币种，仅适用于币币杠杆仓位
	PosSide  string `json:"posSide"`  // 持仓方向，long：开平仓模式开多，short：开平仓模式开空，net：买卖模式（交割/永续/期权：pos为正代表开多，pos为负代表开空。币币杠杆：posCcy为交易货币时，代表开多；posCcy为计价货币时，代表开空。）
	PosSpace string `json:"posSpace"` // 持仓仓位百分比
	UplRatio string `json:"uplRatio"` // 未实现收益率(以标记价格计算)
}

// EcotradePublicPositions
//
//	@Description: 获取当前持仓(旧接口)
//	@param uniqueName 唯一名称
//	@param limit 分页返回的结果集数量，最大为100，不填默认返回100条
//	@param after 请求此时间戳之前（更旧的数据）的分页内容，Unix时间戳的毫秒数格式，如 1597026383085，不填默认当前时间
func (t *V5Priapi) EcotradePublicPositions(uniqueName string, limit int, after int64) []*EcotradePublicPositions {
	j_path, j_resp := "/priapi/v5/ecotrade/public/positions?uniqueName="+uniqueName, make([]*EcotradePublicPositions, 0)
	if limit > 0 && limit <= 100 {
		j_path += "&limit=" + yu_strconv.FormatInt(limit)
	}
	if after > 0 {
		j_path += "&after=" + yu_strconv.FormatInt64(after)
	}
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}

type EcotradePublicPositions_v2 struct {
	LongLever string `json:"longLever"` // 仓位(多)，百分比？
	PosData   []struct {
		Alias    string `json:"alias"`
		AvgPx    string `json:"avgPx"`    // 开仓平均价
		CTime    string `json:"cTime"`    // 持仓创建时间，Unix时间戳的毫秒数格式，如 1597026383085
		InstId   string `json:"instId"`   // 产品ID
		InstType string `json:"instType"` // 产品类型，MARGIN：币币杠杆，SWAP：永续合约，FUTURES：交割合约，OPTION：期权
		Lever    string `json:"lever"`    // 杠杆倍数
		LiqPx    string `json:"liqPx"`    // 预估强平价，不适用于期权
		MgnMode  string `json:"mgnMode"`  // 保证金模式，cross：全仓，isolated：逐仓
		Pos      string `json:"pos"`      // 以张为单位的持仓数量
		PosCcy   string `json:"posCcy"`   // 仓位资产币种，仅适用于币币杠杆仓位
		PosSide  string `json:"posSide"`  // 持仓方向，long：开平仓模式开多，short：开平仓模式开空，net：买卖模式（交割/永续/期权：pos为正代表开多，pos为负代表开空。币币杠杆：posCcy为交易货币时，代表开多；posCcy为计价货币时，代表开空。）
		PosSpace string `json:"posSpace"` // 持仓仓位百分比
		UplRatio string `json:"uplRatio"` // 未实现收益率(以标记价格计算)
	} `json:"posData"`
	ShortLever string `json:"shortLever"` // 仓位(空)，百分比？
}

// EcotradePublicPositions_v2
//
//	@Description: 获取当前持仓
//	@param uniqueName 唯一名称
//	@param limit 分页返回的结果集数量，最大为100，不填默认返回100条
//	@param after 请求此时间戳之前（更旧的数据）的分页内容，Unix时间戳的毫秒数格式，如 1597026383085，不填默认当前时间
func (t *V5Priapi) EcotradePublicPositions_v2(uniqueName string, limit int, after int64) []*EcotradePublicPositions_v2 {
	j_path, j_resp := "/priapi/v5/ecotrade/public/positions-v2?uniqueName="+uniqueName, make([]*EcotradePublicPositions_v2, 0)
	if limit > 0 && limit <= 100 {
		j_path += "&limit=" + yu_strconv.FormatInt(limit)
	}
	if after > 0 {
		j_path += "&after=" + yu_strconv.FormatInt64(after)
	}
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}

type EcotradePublicHistory_positions struct {
	Alias         string `json:"alias"`
	CTime         string `json:"cTime"`
	CloseAvgPx    string `json:"closeAvgPx"`
	CloseUplRatio string `json:"closeUplRatio"`
	CtVal         string `json:"ctVal"`
	InstFamily    string `json:"instFamily"`
	InstId        string `json:"instId"`
	InstType      string `json:"instType"`
	Lever         string `json:"lever"`
	MgnMode       string `json:"mgnMode"`
	OpenAvgPx     string `json:"openAvgPx"`
	PosId         string `json:"posId"`
	PosSide       string `json:"posSide"`
	UTime         string `json:"uTime"`
	Uly           string `json:"uly"`
}

// EcotradePublicHistory_positions
//
//	@Description: 获取历史持仓
//	@param uniqueName 唯一名称
//	@param limit 分页返回的结果集数量，最大为100，不填默认返回100条
//	@param after 请求此时间戳之前（更旧的数据）的分页内容，Unix时间戳的毫秒数格式，如 1597026383085，不填默认当前时间
func (t *V5Priapi) EcotradePublicHistory_positions(uniqueName string, limit int, after int64) []*EcotradePublicHistory_positions {
	j_path, j_resp := "/priapi/v5/ecotrade/public/history-positions?uniqueName="+uniqueName, make([]*EcotradePublicHistory_positions, 0)
	if limit > 0 && limit <= 100 {
		j_path += "&limit=" + yu_strconv.FormatInt(limit)
	}
	if after > 0 {
		j_path += "&after=" + yu_strconv.FormatInt64(after)
	}
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}

type EcotradePublicTrade_records struct {
	Alias      string `json:"alias"`
	AvgPx      string `json:"avgPx"` // 操作平均价
	BaseName   string `json:"baseName"`
	CTime      string `json:"cTime"`      // 订单创建时间
	FillTime   string `json:"fillTime"`   // 订单成交时间
	InstFamily string `json:"instFamily"` // 交易品种，适用于交割/永续/期权
	InstId     string `json:"instId"`     // 产品ID
	InstType   string `json:"instType"`   // 产品类型，MARGIN：币币杠杆，SWAP：永续合约，FUTURES：交割合约，OPTION：期权
	Lever      string `json:"lever"`      // 杠杆倍数
	NickName   string `json:"nickName"`
	OrdId      string `json:"ordId"`      // 订单ID
	OrdType    string `json:"ordType"`    // 订单类型，market：市价单，limit：限价单，post_only：只做maker单，fok：全部成交或立即取消，ioc：立即成交并取消剩余，optimal_limit_ioc：市价委托立即成交并取消剩余（仅适用交割、永续），mmp：做市商保护(仅适用于组合保证金账户模式下的期权订单)，mmp_and_post_only：做市商保护且只做maker单(仅适用于组合保证金账户模式下的期权订单)
	PosSide    string `json:"posSide"`    // 持仓方向，long：开平仓模式开多，short：开平仓模式开空，net：买卖模式（交割/永续/期权：pos为正代表开多，pos为负代表开空。币币杠杆：posCcy为交易货币时，代表开多；posCcy为计价货币时，代表开空。）
	Px         string `json:"px"`         // 委托价格，仅适用于limit、post_only、fok、ioc、mmp、mmp_and_post_only类型的订单
	QuoteName  string `json:"quoteName"`  // 委托单保证金产品名称
	Side       string `json:"side"`       // 订单方向，buy：买， sell：卖
	UTime      string `json:"uTime"`      // 账户信息的更新时间，Unix时间戳的毫秒数格式，如 1718092801068
	Uly        string `json:"uly"`        // 标的指数，如 BTC-USD，仅适用于杠杆/交割/永续/期权
	UniqueName string `json:"uniqueName"` // 唯一名称
}

// EcotradePublicTrade_records
//
//	@Description: 获取操作记录
//	@param uniqueName 唯一名称
//	@param limit 分页返回的结果集数量，最大为100，不填默认返回10条
//	@param startModify 请求此时间戳之后的分页内容，Unix时间戳的毫秒数格式，如 1597026383085，不填默认当前时间
//	@param endModify 请求此时间戳之前的分页内容，Unix时间戳的毫秒数格式，如 1597026383085，不填默认无限
func (t *V5Priapi) EcotradePublicTrade_records(uniqueName string, limit int, startModify int64, endModify int64) []*EcotradePublicTrade_records {
	// https://www.okx.com/priapi/v5/ecotrade/public/trade-records?limit=20&startModify=1710259200000&endModify=1718294399000&uniqueName=7C27B64E785275BA&t=1718283609219
	j_path, j_resp := "/priapi/v5/ecotrade/public/trade-records?uniqueName="+uniqueName, make([]*EcotradePublicTrade_records, 0)
	if limit > 0 && limit <= 100 {
		j_path += "&limit=" + yu_strconv.FormatInt(limit)
	}
	if startModify > 0 {
		j_path += "&startModify=" + yu_strconv.FormatInt64(startModify)
	}
	if endModify > 0 {
		j_path += "&endModify=" + yu_strconv.FormatInt64(endModify)
	}
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}

type EcotradePublicTotal_pnl struct {
	Ratio    string `json:"ratio"`    // 收益率
	StatTime string `json:"statTime"` // 统计时间
}

// EcotradePublicTotal_pnl
//
//	@Description: 获取收益率走势
//	@param uniqueName 唯一名称
func (t *V5Priapi) EcotradePublicTotal_pnl(uniqueName string) []*EcotradePublicTotal_pnl {
	// https://www.okx.com/priapi/v5/ecotrade/public/total-pnl?uniqueName=1775DD3AF3FA883E
	j_path, j_resp := "/priapi/v5/ecotrade/public/total-pnl?uniqueName="+uniqueName, make([]*EcotradePublicTotal_pnl, 0)
	if !t.request("GET", j_path, nil, &j_resp) {
		return nil
	}
	return j_resp
}
