package auth

import (
	"encoding/json"
	"github.com/golang-jwt/jwt"
	"github.com/zeromicro/go-zero/core/logx"
	"net/http"
	"time"
)

type UserInfo struct {
	UserId        int64 `json:"user_id"`         //网站前台登录uid
	BackendUserId int64 `json:"backend_user_id"` //管理后台uid
}

// 签名key
var signKey = "FushenFGbhgfhgKgGH556HGlXrsfJKhhjYFGKLO=="
var expireTime = int64(3600)

// 生成token
func GenJwtToken(userInfo UserInfo) (token string, err error) {
	t := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
		"user_id":         userInfo.UserId,
		"backend_user_id": userInfo.BackendUserId,
		"exp":             time.Now().Add(time.Second * time.Duration(expireTime)).Unix(), //过期时间
		"iss":             "fusen",
	})
	token, err = t.SignedString([]byte(signKey))
	if err != nil {
		return "", err
	}
	return
}

// 解释token
func ParseJwtToken(token string) (UserInfo, error) {
	t, err := jwt.ParseWithClaims(token, jwt.MapClaims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(signKey), nil
	})
	if err != nil {
		return UserInfo{}, err
	}
	d, err := json.Marshal(t.Claims)
	if err != nil {
		return UserInfo{}, err
	}
	var userInfo UserInfo
	if err = json.Unmarshal(d, &userInfo); err != nil {
		return UserInfo{}, err
	}
	return userInfo, nil
}

// 检测授权
func CheckAuth(r *http.Request) UserInfo {
	token := r.Header.Get("Authorization")
	if token == "" {
		token = r.Header.Get("Auth-Key")
	}
	if token == "" {
		logx.Error("token is empty")
		return UserInfo{}
	}
	//解析token
	userInfo, err := ParseJwtToken(token)
	if err != nil {
		logx.Error(err)
		return UserInfo{}
	}
	return userInfo
}