package bitgetservice

import "time"

// SubscribeReq 订阅请求结构（基于官方SDK）
type SubscribeReq struct {
	InstType string `json:"instType"` // 产品类型：SPOT-现货，UMCBL-U本位合约，DMCBL-币本位合约
	Channel  string `json:"channel"`  // 频道名称
	InstId   string `json:"instId"`   // 产品ID
	// Coin     string `json:"coin"`     // 币种（可选）
}

// WsBaseReq WebSocket基础请求结构
type WsBaseReq struct {
	Op   string        `json:"op"`   // 操作类型：subscribe, unsubscribe, login
	Args []interface{} `json:"args"` // 参数列表
}

// WsLoginReq WebSocket登录请求
type WsLoginReq struct {
	ApiKey     string `json:"apiKey"`
	Passphrase string `json:"passphrase"`
	Timestamp  string `json:"timestamp"`
	Sign       string `json:"sign"`
}

// OnReceive 消息接收回调函数类型
type OnReceive func(message string)

// Set 集合数据结构（简化实现）
type Set struct {
	items map[SubscribeReq]bool
}

// NewSet 创建新的集合
func NewSet() *Set {
	return &Set{
		items: make(map[SubscribeReq]bool),
	}
}

// Add 添加元素到集合
func (s *Set) Add(item SubscribeReq) {
	s.items[item] = true
}

// Remove 从集合中移除元素
func (s *Set) Remove(item SubscribeReq) {
	delete(s.items, item)
}

// Contains 检查集合是否包含元素
func (s *Set) Contains(item SubscribeReq) bool {
	_, exists := s.items[item]
	return exists
}

// BitgetMarketData 市场数据基础结构
type BitgetMarketData struct {
	Action string       `json:"action"` // 推送类型
	Arg    SubscribeReq `json:"arg"`    // 订阅参数
	Data   interface{}  `json:"data"`   // 数据内容
	Ts     int64        `json:"ts"`     // 时间戳
}

// TickerData 行情数据
type TickerData struct {
	InstId    string `json:"instId"`    // 产品ID
	Last      string `json:"last"`      // 最新价
	Open24h   string `json:"open24h"`   // 24小时开盘价
	High24h   string `json:"high24h"`   // 24小时最高价
	Low24h    string `json:"low24h"`    // 24小时最低价
	Change24h string `json:"change24h"` // 24小时涨跌幅
	Vol24h    string `json:"vol24h"`    // 24小时成交量
	VolCcy24h string `json:"volCcy24h"` // 24小时成交额
	Ts        string `json:"ts"`        // 时间戳
}

// DepthData 深度数据
type DepthData struct {
	InstId string     `json:"instId"` // 产品ID
	Asks   [][]string `json:"asks"`   // 卖盘 [价格, 数量]
	Bids   [][]string `json:"bids"`   // 买盘 [价格, 数量]
	Ts     string     `json:"ts"`     // 时间戳
}

// TradeData 成交数据
type TradeData struct {
	InstId  string `json:"instId"`  // 产品ID
	TradeId string `json:"tradeId"` // 成交ID
	Px      string `json:"px"`      // 成交价格
	Sz      string `json:"sz"`      // 成交数量
	Side    string `json:"side"`    // 成交方向 buy/sell
	Ts      string `json:"ts"`      // 成交时间
}

// KlineData K线数据
type KlineData struct {
	InstId string   `json:"instId"` // 产品ID
	Candle []string `json:"candle"` // K线数据 [时间戳, 开盘价, 最高价, 最低价, 收盘价, 成交量, 成交额]
	Ts     string   `json:"ts"`     // 时间戳
}

// BitgetMarketConfig 市场数据配置
type BitgetMarketConfig struct {
	WsUrl             string        // WebSocket地址
	ReconnectInterval time.Duration // 重连间隔
	PingInterval      time.Duration // Ping间隔
	ReadTimeout       time.Duration // 读取超时
	WriteTimeout      time.Duration // 写入超时
	MaxReconnectTimes int           // 最大重连次数
	EnableCompression bool          // 是否启用压缩
}

// DefaultMarketConfig 默认市场数据配置
func DefaultMarketConfig() *BitgetMarketConfig {
	return &BitgetMarketConfig{
		WsUrl:             "wss://ws.bitget.com/v2/ws/public",
		ReconnectInterval: 5 * time.Second,
		PingInterval:      15 * time.Second,
		ReadTimeout:       60 * time.Second,
		WriteTimeout:      10 * time.Second,
		MaxReconnectTimes: 10,
		EnableCompression: false,
	}
}
