package commonservice

import (
	"errors"
	"fmt"
	"go-admin/common/global"
	"go-admin/common/helper"
	"go-admin/models/binancedto"
	"time"

	"github.com/bytedance/sonic"
)

// 判断api订阅是否超时
// wsType 1 现货 2 合约
func JudgeWebsocketTimeout(apiKey string, wsType int) error {
	key := fmt.Sprintf(global.USER_SUBSCRIBE, apiKey)
	cache := binancedto.UserSubscribeState{}
	// 从redis中获取订阅信息
	subscribeInfo, err := helper.DefaultRedis.GetString(key)
	if err != nil {
		return errors.New("获取订阅信息失败")
	}

	sonic.Unmarshal([]byte(subscribeInfo), &cache)

	if cache.FuturesLastTime == nil && cache.SpotLastTime == nil {
		return errors.New("未订阅任何行情")
	}

	var timeOutInterval time.Duration

	if wsType == 1 {
		timeOutInterval = time.Minute * 2
	} else {
		timeOutInterval = time.Minute * 4
	}

	switch wsType {
	case 1:
		// 现货
		if cache.SpotLastTime == nil {
			return errors.New("未订阅现货行情")
		}

		if time.Since(*cache.SpotLastTime) > timeOutInterval {
			return errors.New("现货行情订阅超时")
		}
	case 2:
		// 合约
		if cache.FuturesLastTime == nil {
			return errors.New("未订阅合约行情")
		}

		if time.Since(*cache.FuturesLastTime) > timeOutInterval {
			return errors.New("合约行情订阅超时")
		}
	default:
		return errors.New("无效的wsType")
	}

	return nil
}
