package ws

import (
	"fmt"
	"log"
	"testing"
	"time"
)

const (
	TRADE_ACCOUNT = iota
	ISOLATE_ACCOUNT
	CROSS_ACCOUNT
	CROSS_ACCOUNT_B
)

func prework_pri(t int) *WsClient {
	ep := "wss://wsaws.okex.com:8443/ws/v5/private"
	var apikey, passphrase, secretKey string
	// 把账号密码写这里
	switch t {
	case TRADE_ACCOUNT:
		apikey = "fe468418-5e40-433f-8d04-04951286d417"
		passphrase = "M4pw71Id"
		secretKey = "D6D74DF9DD60A25BE2B27CA71D8F814D"
	case ISOLATE_ACCOUNT:
		apikey = "fe468418-5e40-433f-8d04-04951286d417"
		passphrase = "M4pw71Id"
		secretKey = "D6D74DF9DD60A25BE2B27CA71D8F814D"
	case CROSS_ACCOUNT:
		apikey = "fe468418-5e40-433f-8d04-04951286d417"
		passphrase = "M4pw71Id"
		secretKey = "D6D74DF9DD60A25BE2B27CA71D8F814D"
	case CROSS_ACCOUNT_B:
		apikey = "fe468418-5e40-433f-8d04-04951286d417"
		passphrase = "M4pw71Id"
		secretKey = "D6D74DF9DD60A25BE2B27CA71D8F814D"
	}

	r, err := NewWsClient(ep)
	if err != nil {
		log.Fatal(err)
	}

	err = r.Start()
	if err != nil {
		log.Fatal(err)
	}

	var res bool
	//start := time.Now()
	res, _, err = r.Login(apikey, secretKey, passphrase)
	if res {
		//usedTime := time.Since(start)
		//fmt.Println("登录成功!",usedTime.String())
	} else {
		log.Fatal("登录失败!", err)
	}
	fmt.Println(apikey, secretKey, passphrase)
	return r
}

// 账户频道 测试
func TestAccout(t *testing.T) {
	r := prework_pri(CROSS_ACCOUNT)
	var res bool
	var err error

	var args []map[string]string
	arg := make(map[string]string)
	//arg["ccy"] = "BTC"
	args = append(args, arg)

	start := time.Now()
	res, _, err = r.PrivAccout(OP_SUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("订阅所有成功!", usedTime.String())
	} else {
		fmt.Println("订阅所有成功!", err)
		t.Fatal("订阅所有成功!", err)
	}

	time.Sleep(100 * time.Second)
	start = time.Now()
	res, _, err = r.PrivAccout(OP_UNSUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("取消订阅所有成功!", usedTime.String())
	} else {
		fmt.Println("取消订阅所有失败!", err)
		t.Fatal("取消订阅所有失败!", err)
	}

}

// 持仓频道 测试
func TestPositon(t *testing.T) {
	r := prework_pri(CROSS_ACCOUNT)
	var err error
	var res bool

	var args []map[string]string
	arg := make(map[string]string)
	arg["instType"] = FUTURES
	arg["uly"] = "BTC-USD"
	//arg["instId"] = "BTC-USD-210319"
	args = append(args, arg)

	start := time.Now()
	res, _, err = r.PrivPostion(OP_SUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("订阅成功!", usedTime.String())
	} else {
		fmt.Println("订阅失败!", err)
		t.Fatal("订阅失败!", err)
		//return
	}

	time.Sleep(60000 * time.Second)
	//等待推送

	start = time.Now()
	res, _, err = r.PrivPostion(OP_UNSUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("取消订阅成功!", usedTime.String())

	} else {
		fmt.Println("取消订阅失败!", err)
		t.Fatal("取消订阅失败!", err)
	}

}

// 订单频道 测试
func TestBookOrder(t *testing.T) {
	r := prework_pri(CROSS_ACCOUNT)
	var err error
	var res bool

	var args []map[string]string
	arg := make(map[string]string)
	arg["instId"] = "BTC-USDT"
	arg["instType"] = "ANY"
	//arg["instType"] = "SWAP"
	args = append(args, arg)

	start := time.Now()
	res, _, err = r.PrivBookOrder(OP_SUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("订阅成功!", usedTime.String())
	} else {
		fmt.Println("订阅失败!", err)
		t.Fatal("订阅失败!", err)
		//return
	}

	time.Sleep(6000 * time.Second)
	//等待推送

	start = time.Now()
	res, _, err = r.PrivBookOrder(OP_UNSUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("取消订阅成功!", usedTime.String())
	} else {
		fmt.Println("取消订阅失败!", err)
		t.Fatal("取消订阅失败!", err)
	}

}

// 策略委托订单频道 测试
func TestAlgoOrder(t *testing.T) {
	r := prework_pri(CROSS_ACCOUNT)
	var err error
	var res bool

	var args []map[string]string
	arg := make(map[string]string)
	arg["instType"] = "SPOT"
	args = append(args, arg)

	start := time.Now()
	res, _, err = r.PrivBookAlgoOrder(OP_SUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("订阅成功!", usedTime.String())
	} else {
		fmt.Println("订阅失败!", err)
		t.Fatal("订阅失败!", err)
		//return
	}

	time.Sleep(60 * time.Second)
	//等待推送

	start = time.Now()
	res, _, err = r.PrivBookAlgoOrder(OP_UNSUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("取消订阅成功!", usedTime.String())
	} else {
		fmt.Println("取消订阅失败!", err)
		t.Fatal("取消订阅失败!", err)
	}

}

// 账户余额和持仓频道 测试
func TestPrivBalAndPos(t *testing.T) {
	r := prework_pri(CROSS_ACCOUNT)
	var err error
	var res bool

	var args []map[string]string
	arg := make(map[string]string)
	args = append(args, arg)

	start := time.Now()
	res, _, err = r.PrivBalAndPos(OP_SUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("订阅成功!", usedTime.String())
	} else {
		fmt.Println("订阅失败!", err)
		t.Fatal("订阅失败!", err)
		//return
	}

	time.Sleep(600 * time.Second)
	//等待推送

	start = time.Now()
	res, _, err = r.PrivBalAndPos(OP_UNSUBSCRIBE, args)
	if res {
		usedTime := time.Since(start)
		fmt.Println("取消订阅成功!", usedTime.String())
	} else {
		fmt.Println("取消订阅失败!", err)
		t.Fatal("取消订阅失败!", err)
	}

}