package tests

import (
	"fengkuangGameServerJob/pkg/util"
	"fengkuangGameServerJob/service"
	"fmt"
	"github.com/beego/beego/v2/adapter/httplib"
	"reflect"
	"sort"
	"strings"
	"testing"
)

type CallBackParam struct {
	OrderId string `json:"orderid"`
	OpenId  string `json:"openid"`
	Price   int    `json:"price"`
	ItemId  int    `json:"item_id"`
	Other   string `json:"other"`
	Sign    string `json:"sign"`
}

func Struct2Map(obj interface{}) map[string]interface{} {
	t := reflect.TypeOf(obj)
	v := reflect.ValueOf(obj)

	var data = make(map[string]interface{})
	for i := 0; i < t.NumField(); i++ {
		data[string(t.Field(i).Tag.Get("json"))] = v.Field(i).Interface()
	}
	return data
}

func GetMapKeys(m map[string]interface{}) []string {
	keys := make([]string, 0, len(m))
	for k, _ := range m {
		keys = append(keys, k)
	}
	return keys
}

//测试签名
func TestCheckSign(t *testing.T) {
	p := CallBackParam{
		OrderId: "1673818833980639232_101_oavLA5YBJ5vLwQUiDDSFetITK1q8_15001",
		OpenId:  "oavLA5YBJ5vLwQUiDDSFetITK1q8",
		Price:   8,
		ItemId:  1,
		Other:   "1673818805153259520&101_15001",
		Sign:    "48697a7857e450032dee34ee913e51b3",
	}
	secret := "T11FW3TN9HCIU6UBA93G1O9STD96QD71"
	pMap := Struct2Map(p)
	keys := GetMapKeys(pMap)
	sort.Strings(keys)
	//拼接成字符串
	tmpStr := ""
	for _, v := range keys {
		if v == "sign" {
			continue
		}
		tmpStr += fmt.Sprintf("%s=%v&", v, pMap[v])
	}
	tmpStr = strings.TrimRight(tmpStr, "&")
	tmpStr += secret
	tmpSign := util.EncodeMD5(tmpStr)
	if tmpSign == p.Sign {
		fmt.Println("ok")
	} else {
		fmt.Println("error")
	}

}

func TestGetOrderInfo(t *testing.T) {
	tmpToSignStr := "channel=T11FW3TN9HCIU6UBA93G1O9STD96QD71&orderid=1673818805153415168_101_15001"
	sign := util.EncodeMD5(tmpToSignStr)
	fmt.Println(sign)
	req := httplib.Post("http://docater1.cn/index.php?g=Wap&m=MiniGame&a=getPayInfo")
	req.Param("channel", "T11FW3TN9HCIU6UBA93G1O9STD96QD71")
	req.Param("orderid", "1673818805153415168_101_15001")
	req.Param("sign", sign)
	s, err := req.String()
	if err != nil {
		fmt.Println("111")
		fmt.Println(err)
	} else {
		fmt.Println("-----")
		fmt.Println(s)
	}
}

func TestNil(t *testing.T) {
	var s map[int]interface{} = nil
	fmt.Println(s == nil)

	var err error = nil
	fmt.Println(err == nil)
}

func TestOrderPaid(t *testing.T) {
	orderService := service.NewOrderService()
	orderService.UpdateState("6940680346090389504")
}

func TestPaidToRedis(t *testing.T) {
	s := service.NewNotifyService()
	s.OrderPaid("123",135)
}

func TestGetSecret(t *testing.T)  {
	orderService := service.NewOrderService()
	orderService.GetSecret("2004963851762982912")
}