package util

import (
	"dsbqj-admin/pkg/logger"
	"encoding/base64"

	"github.com/goccy/go-json"
)

//var jwtSecret []byte
//
//type Claims struct {
//	ID       string
//	UserName string
//	jwt.StandardClaims
//}
//
//// GenerateToken generate tokens used for auth
//func GenerateToken(user model.User, secret string) (string, error) {
//	nowTime := time.Now()
//	expireTime := nowTime.Add(3 * time.Hour)
//
//	claims := Claims{
//		EncodeMD5(hashid.HashID(user.ID, hashid.UserID)),
//		EncodeMD5(user.UserName),
//
//		jwt.StandardClaims{
//			ExpiresAt: expireTime.Unix(),
//			Issuer:    "gin-blog",
//		},
//	}
//
//	tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
//	token, err := tokenClaims.SignedString(jwtSecret)
//
//	return token, err
//}
//
//// ParseToken parsing token
//func ParseToken(token string, secret string) (*Claims, error) {
//	tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
//		return jwtSecret, nil
//	})
//
//	if tokenClaims != nil {
//		if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
//			return claims, nil
//		}
//	}
//
//	return nil, err
//}

type Token struct {
	ID        uint   `json:"id"`
	Status    string `json:"status"`
	Role      string `json:"role"`
	Gender    string `json:"gender"`
	ExpiresIn int64  `json:"expires_in"`
	CreateAt  int64  `json:"create_at"`
}

func GenerateToken(src interface{}, key string) string {

	ci := NewAesCipher128([]byte(key), []byte("Power-Doom"))

	//转json
	j, err := json.Marshal(src)
	if err != nil {
		logger.Error("数据转换错误", err)
		return ""
	}

	res := ci.Encrypt(j)
	return base64.StdEncoding.EncodeToString(res)
}

func ParseToken(src string, key string) []byte {
	defer func() {
		err := recover() //内置函数，可以捕捉到函数异常
		if err != nil {
			//这里是打印错误，还可以进行报警处理，例如微信，邮箱通知
			logger.Error("token解析错误：", err)
		}
	}()

	plain, err := base64.StdEncoding.DecodeString(src)
	if err != nil {
		logger.Error("token解析错误", err)
		return []byte{}
	}

	ci := NewAesCipher128([]byte(key), []byte("Power-Doom"))
	return ci.Decrypt(plain)
}
