package serverinit

import (
	"go-admin/config"
	"go-admin/models"
	"go-admin/pkg/httputils"
	"go-admin/pkg/utility"
	"go-admin/services/bitgetservice"

	log "github.com/go-admin-team/go-admin-core/logger"
	"github.com/robfig/cron/v3"
)

// BitgetInit 初始化Bitget交易所
func BitgetMarketInit() error {
	// 设置代理（如果配置了的话）
	httputils.InitProxy(config.ExtConfig.ProxyUrl)

	log.Info("初始化Bitget交易对-开始")
	spotData := make(map[string]models.TradeSet, 0)
	futData := make(map[string]models.TradeSet, 0)
	err := bitgetservice.GetAndReloadSymbols(&spotData, 1)

	if err != nil {
		log.Error("初始化Bitget交易对失败，可能是网络问题，将跳过初始化:", err)
		// 不返回错误，允许程序继续运行
		return nil
	}

	err = bitgetservice.GetAndReloadSymbols(&futData, 2)
	if err != nil {
		log.Error("初始化Bitget合约交易对失败，可能是网络问题，将跳过初始化:", err)
		// 不返回错误，允许程序继续运行
		return nil
	}

	log.Info("初始化Bitget交易对-结束")

	log.Info("初始化Bitget 24h行情-开始")
	_, err = bitgetservice.InitSymbolsTicker24h(&spotData, 1)

	if err != nil {
		log.Error("初始化Bitget 24h行情失败，可能是网络问题，将跳过初始化:", err)
		// 不返回错误，允许程序继续运行
		return nil
	}

	_, err = bitgetservice.InitSymbolsTicker24h(&futData, 2)
	if err != nil {
		log.Error("初始化Bitget合约24h行情失败，可能是网络问题，将跳过初始化:", err)
		// 不返回错误，允许程序继续运行
		return nil
	}
	log.Info("初始化Bitget 24h行情-结束")

	//现货行情订阅
	spotSymbols := []string{}
	for k, _ := range spotData {
		spotSymbols = append(spotSymbols, k)
	}
	spotMaps := utility.SplitSlice(spotSymbols, 50)
	bitgetSpot := bitgetservice.BitgetMarketSpotClient{}

	for _, v := range spotMaps {
		if err := bitgetSpot.Subscribe(v); err != nil {
			log.Error("订阅Bitget现货行情失败", err)
			return err
		}
	}

	//合约行情订阅
	futSymbols := []string{}
	for k, _ := range futData {
		futSymbols = append(futSymbols, k)
	}
	futMaps := utility.SplitSlice(futSymbols, 50)
	bitgetFut := bitgetservice.BitgetMarketFutureClient{}

	for _, v := range futMaps {
		if err := bitgetFut.Subscribe(v); err != nil {
			log.Error("订阅Bitget合约行情失败", err)
			return err
		}
	}

	// 启动定时任务
	runBitgetJobs()

	return nil
}

// runBitgetJobs 启动Bitget相关的定时任务
func runBitgetJobs() {
	cronJob := cron.New()

	// 每小时更新一次交易对信息
	_, err := cronJob.AddFunc("@every 1h", func() {
		log.Info("执行Bitget交易对更新任务")
		data := make(map[string]models.TradeSet, 0)
		if err := bitgetservice.GetAndReloadSymbols(&data, 1); err != nil {
			log.Error("更新Bitget交易对失败", err)
		}
	})

	if err != nil {
		log.Error("添加Bitget交易对更新任务失败", err)
	} else {
		log.Info("添加Bitget交易对更新任务成功")
	}

	// 启动定时任务
	cronJob.Start()
	log.Info("Bitget定时任务启动完成")
}

// CreateBitgetPrivateWebSocket 创建Bitget私有WebSocket连接的示例函数
func CreateBitgetPrivateWebSocket(apiKey, apiSecret, passphrase, proxyType, proxyAddress string) {
	log.Info("创建Bitget私有WebSocket连接 key:", apiKey)

	// 现货WebSocket (wsType=0)
	spotManager := bitgetservice.GetOrCreateBitgetWebSocketManager(
		0, apiKey, apiSecret, passphrase, proxyType, proxyAddress)
	spotManager.Start()

	// 合约WebSocket (wsType=1)
	futuresManager := bitgetservice.GetOrCreateBitgetWebSocketManager(
		1, apiKey, apiSecret, passphrase, proxyType, proxyAddress)
	futuresManager.Start()

	log.Info("Bitget私有WebSocket连接已创建")
}

// StopBitgetPrivateWebSocket 停止Bitget私有WebSocket连接的示例函数
func StopBitgetPrivateWebSocket(apiKey string) {
	log.Info("停止Bitget私有WebSocket连接 key:", apiKey)

	// 停止现货WebSocket
	bitgetservice.StopBitgetWebSocketManager(0, apiKey)

	// 停止合约WebSocket
	bitgetservice.StopBitgetWebSocketManager(1, apiKey)

	log.Info("Bitget私有WebSocket连接已停止")
}
