package xjwt

import (
	"fmt"
	"github.com/golang-jwt/jwt/v5"
	"mylomen_server/common/dto"
	"testing"
	"time"
)

func TestGenAndParse(t *testing.T) {
	mySigningKey := []byte("AllYourBase")

	claims := dto.LoginTokenVo{
		Sn:    "mySn",
		Token: "myToken",

		RegisteredClaims: jwt.RegisteredClaims{
			Audience:  []string{"mylomen.com"},
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(1 * time.Hour)),
			IssuedAt:  jwt.NewNumericDate(time.Now()),
			Issuer:    "mylomen.com",
			NotBefore: jwt.NewNumericDate(time.Now()),
			Subject:   "1",
		},
	}

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	ss, err := token.SignedString(mySigningKey)
	fmt.Println(ss, err)

	parseToken, err := jwt.ParseWithClaims(ss, &dto.LoginTokenVo{}, func(token *jwt.Token) (interface{}, error) {
		return mySigningKey, nil
	})

	if userClaims, ok := parseToken.Claims.(*dto.LoginTokenVo); ok && parseToken.Valid {
		t.Log(userClaims, userClaims.RegisteredClaims.Issuer)
	} else {
		fmt.Println(err)
		t.Error("验证失败")
	}
}

func TestHs256(t *testing.T) {
	type User struct {
		Id   int64
		Name string
	}
	type UserClaims struct {
		User User
		jwt.RegisteredClaims
	}
	// 1 jwt.NewWithClaims生成token
	user := User{
		Id:   101,
		Name: "hisheng",
	}
	userClaims := UserClaims{
		User:             user,
		RegisteredClaims: jwt.RegisteredClaims{},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, userClaims)

	// 2 把token加密
	mySigningKey := []byte("ushjlwmwnwht")
	ss, err := token.SignedString(mySigningKey)
	t.Log(ss, err)
}

func TestHs256Parse(t *testing.T) {
	tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE"

	type User struct {
		Id   int64
		Name string
	}
	type UserClaims struct {
		User User
		jwt.RegisteredClaims
	}

	token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte("ushjlwmwnwht"), nil
	})

	if userClaims, ok := token.Claims.(*UserClaims); ok && token.Valid {
		t.Log(userClaims, userClaims.RegisteredClaims.Issuer)
	} else {
		t.Log(err)
	}
}

func TestGenJwtTokenThenParse(t *testing.T) {
	claims := dto.LoginTokenVo{}
	claims.Sn = "mySn"
	claims.Token = "myToken"
	claims.RegisteredClaims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(24 * time.Hour))
	jwtToken := GenJwtToken(claims)

	//parse
	data, err := ParseJwtToken(jwtToken)
	if err != nil {
		t.Error(err)
		return
	}
	if data.Sn != claims.Sn {
		t.Error("Sn 不一致")
	}
}