package utils

import (
	"errors"
	"time"

	jwt "github.com/dgrijalva/jwt-go"
)

const (
	TokenHeader = "Authorization"
	TokenSchema = "Bearer"
)

var tokenSignedKey = []byte(`Yansen is so handsome!`)

// CreateToken 获取token
func CreateToken(info map[string]interface{}) (string, error) {
	claims := jwt.MapClaims(info)
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString(tokenSignedKey)
}

// PareseToken 解析 token
func PareseToken(token string) (map[string]interface{}, error) {
	tk, err := jwt.Parse(token, func(t *jwt.Token) (interface{}, error) {
		return tokenSignedKey, nil
	})

	if err != nil {
		return nil, err
	}

	if claims, ok := tk.Claims.(jwt.MapClaims); ok && tk.Valid {
		info := map[string]interface{}(claims)
		return info, nil
	}

	return nil, errors.New("Token 解析 未知错误")
}

// JWTToken token 内容
type JWTToken struct {
	Guest    bool
	ID       string
	Password string
	BatchNo  string
	Expire   time.Time
}

// ToMap 转 map
func (t *JWTToken) ToMap() map[string]interface{} {
	return map[string]interface{}{
		"guest":    t.Guest,
		"user":     t.ID,
		"password": t.Password,
		"batchno":  t.BatchNo,
		"exp":      t.Expire.Format("2006-01-02 15:04:05"),
	}
}

// MapToJWTToken map 映射 Token
func MapToJWTToken(data map[string]interface{}) *JWTToken {
	token := JWTToken{}

	if data["guest"] != nil {
		token.Guest = data["guest"].(bool)
	}

	if data["user"] != nil {
		token.ID = data["user"].(string)
	}

	if data["password"] != nil {
		token.Password = data["password"].(string)
	}

	if data["batchno"] != nil {
		token.BatchNo = data["batchno"].(string)
	}

	if data["exp"] != nil {
		exp, _ := time.Parse("2006-01-02 15:04:05", data["exp"].(string))
		token.Expire = exp
	}

	return &token
}