package jwt

import (
	"errors"
	"time"

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

func Generate(data []byte, key string, expiredIn time.Time) (string, error) {
	atClaims := jwt.MapClaims{}
	atClaims["data"] = string(data)
	atClaims["exp"] = expiredIn.Unix()
	at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
	token, err := at.SignedString([]byte(key))
	if err != nil {
		return "", err
	}
	return token, nil
}

func Decode(token string, key string) ([]byte, error) {

	claims := make(jwt.MapClaims)
	t, err := jwt.ParseWithClaims(token, claims, func(*jwt.Token) (interface{}, error) {
		return []byte(key), nil
	})
	if err != nil {
		return nil, err
	}

	if !t.Valid {
		return nil, errors.New("invalid token")
	}

	data, ok := claims["data"].(string)

	if !ok {
		return nil, errors.New("invalid token")
	}

	return []byte(data), nil
}
