package yu_bitget

type Contracts struct {
	Symbol              string   `json:"symbol"`              // 产品名称
	BaseCoin            string   `json:"baseCoin"`            // 基础币，如 ETHUSDT 中，特指ETH
	QuoteCoin           string   `json:"quoteCoin"`           // 计价币，如 ETHUSDT 中，特指USDT
	BuyLimitPriceRatio  string   `json:"buyLimitPriceRatio"`  // 买价限价比例
	SellLimitPriceRatio string   `json:"sellLimitPriceRatio"` // 卖价限价比例
	FeeRateUpRatio      string   `json:"feeRateUpRatio"`      // 手续费上浮比例
	MakerFeeRate        string   `json:"makerFeeRate"`        // Maker手续费率
	TakerFeeRate        string   `json:"takerFeeRate"`        // Taker手续费率
	OpenCostUpRatio     string   `json:"openCostUpRatio"`     // 开仓成本上浮比例
	SupportMarginCoins  []string `json:"supportMarginCoins"`  // 支持保证金币种
	MinTradeNum         string   `json:"minTradeNum"`         // 最小开单数量(基础币)
	PriceEndStep        string   `json:"priceEndStep"`        // 价格步长
	VolumePlace         string   `json:"volumePlace"`         // 数量小数位
	PricePlace          string   `json:"pricePlace"`          // 价格小数位
	SizeMultiplier      string   `json:"sizeMultiplier"`      // 下单数量要大于 minTradeNum 并且满足 sizeMultiplier 的倍数
	SymbolType          string   `json:"symbolType"`          // 合约类型，perpetual 永续，delivery 交割
	MinTradeUSDT        string   `json:"minTradeUSDT"`        // 最小USDT交易额
	MaxSymbolOrderNum   string   `json:"maxSymbolOrderNum"`   // 最大持有订单数（symbol维度）
	MaxProductOrderNum  string   `json:"maxProductOrderNum"`  // 最大持有订单数（产品类型维度）
	MaxPositionNum      string   `json:"maxPositionNum"`      // 最大持有仓位数量
	SymbolStatus        string   `json:"symbolStatus"`        // 交易对状态，listed 上架，normal 正常/开盘，maintain 禁止交易
	OffTime             string   `json:"offTime"`             // 下架时间，'-1' 表示正常
	LimitOpenTime       string   `json:"limitOpenTime"`       // 可开仓时间，'-1' 表示正常
	DeliveryTime        string   `json:"deliveryTime"`        // 交割时间
	DeliveryStartTime   string   `json:"deliveryStartTime"`   // 交割开始时间
	LaunchTime          string   `json:"launchTime"`          // 上架时间
	FundInterval        string   `json:"fundInterval"`        // 资金费结算周期
	MinLever            string   `json:"minLever"`            // 最小杠杆
	MaxLever            string   `json:"maxLever"`            // 最大杠杆
	PosLimit            string   `json:"posLimit"`            // 持仓限制
	MaintainTime        string   `json:"maintainTime"`        // 维护时间（状态处于维护/即将维护时会有值）
}

// Contracts 获取合约信息
//
//	@Description:
//	@param productType 产品类型
//	@param symbol 交易币对
func (t *V2Rest) Contracts(productType ProductType, symbol string) *Contracts {
	j_path, j_resp := "/api/v2/mix/market/contracts?productType="+string(productType)+"&symbol="+symbol, make([]*Contracts, 0)
	if t.request("GET", j_path, nil, &j_resp) {
		return j_resp[0]
	}
	return nil
}

type SymbolPrice struct {
	Symbol     string `json:"symbol"`     // 币对名称，如："BTCUSDT"
	Price      string `json:"price"`      // 最新成交价格
	IndexPrice string `json:"indexPrice"` // 指数价格
	MarkPrice  string `json:"markPrice"`  // 标记价格
	Timestamp  string `json:"ts"`         // 当前数据时间戳，Unix时间戳的毫秒数格式，如1672410780000
}

// SymbolPrice 获取交易对市价/指数/标记价格
//
//	@Description:
//	@param productType 产品类型
//	@param symbol 交易币对
func (t *V2Rest) SymbolPrice(productType ProductType, symbol string) *SymbolPrice {
	j_path, j_resp := "/api/v2/mix/market/symbol-price?productType="+string(productType)+"&symbol="+symbol, make([]*SymbolPrice, 0)
	if t.request("GET", j_path, nil, &j_resp) {
		return j_resp[0]
	}
	return nil
}

type CurrentFundRate struct {
	Symbol      string `json:"symbol"`      // 币对名称，如："BTCUSDT"
	FundingRate string `json:"fundingRate"` // 当前资金费率
}

// CurrentFundRate 获取当前资金费率
//
//	@Description:
//	@param productType 产品类型
//	@param symbol 交易币对
func (t *V2Rest) CurrentFundRate(productType ProductType, symbol string) *CurrentFundRate {
	j_path, j_resp := "/api/v2/mix/market/current-fund-rate?productType="+string(productType)+"&symbol="+symbol, make([]*CurrentFundRate, 0)
	if t.request("GET", j_path, nil, &j_resp) {
		return j_resp[0]
	}
	return nil
}

type HistoryCandlesArgs struct {
	Symbol      string      `json:"symbol"`      // 交易币对名称
	ProductType ProductType `json:"productType"` // 产品类型
	Granularity Granularity `json:"granularity"` // K线粒度
	// 开始时间，查询该时间之后的K线
	//  Unix时间戳的毫秒数格式，如1672410780000
	//  最大查询范围为90天
	StartTime string `json:"startTime,omitempty"`
	// 结束时间，查询该时间之前的K线
	//  Unix时间戳的毫秒数格式，如1672410780000
	//  最大查询范围为90天
	EndTime string `json:"endTime,omitempty"`
	// 数据条数限制
	//  默认100，最大200
	Limit string `json:"limit,omitempty"`
}

type Granularity string

const (
	G1m     Granularity = "1m"     // 1分钟
	G3m     Granularity = "3m"     // 3分钟
	G5m     Granularity = "5m"     // 5分钟
	G15m    Granularity = "15m"    // 15分钟
	G30m    Granularity = "30m"    // 30分钟
	G1H     Granularity = "1H"     // 1小时
	G4H     Granularity = "4H"     // 4小时
	G6H     Granularity = "6H"     // 6小时
	G12H    Granularity = "12H"    // 12小时
	G1D     Granularity = "1D"     // 1天
	G3D     Granularity = "3D"     // 3天
	G1W     Granularity = "1W"     // 1周
	G1M     Granularity = "1M"     // 月线
	G6Hutc  Granularity = "6Hutc"  // 零时区 6小时线
	G12Hutc Granularity = "12Hutc" // 零时区12小时线
	G1Dutc  Granularity = "1Dutc"  // 零时区 1日线
	G3Dutc  Granularity = "3Dutc"  // 零时区 3日线
	G1Wutc  Granularity = "1Wutc"  // 零时区 周线
	G1Mutc  Granularity = "1Mutc"  // 零时区 月线
)

// HistoryCandles
//
//	[0] = 时间戳, Unix时间戳的毫秒数格式，如 1597026383085
//	[1] = 开盘价
//	[2] = 最高价
//	[3] = 最低价
//	[4] = 收盘价（只包含已完结K线）
//	[5] = 交易币成交量
//	[6] = 计价币成交量
type HistoryCandles [7]string

// HistoryCandles 合约历史k线
func (t *V2Rest) HistoryCandles(args HistoryCandlesArgs) []*HistoryCandles {
	j_path, j_resp := "/api/v2/mix/market/history-candles?productType="+string(args.ProductType)+
		"&symbol="+args.Symbol+"&granularity="+string(args.Granularity)+
		"&startTime="+args.StartTime+"&endTime="+args.EndTime+
		"&limit="+args.Limit,
		make([]*HistoryCandles, 0)
	t.request("GET", j_path, nil, &j_resp)
	return j_resp
}
