package utils

import (
	"time"

	"github.com/golang-jwt/jwt"

	"github.com/pingcap/test-infra/common/model"
)

const JWT_EXP = 30 * 24 * time.Hour

// SessionUser ...
type SessionUser struct {
	ID model.ID `json:"id"`
}

type JWTClaims struct {
	User SessionUser `json:"u"`
	jwt.StandardClaims
}

func (t *JWTClaims) Valid() error {
	return t.StandardClaims.Valid()
}

func (t JWTClaims) Encode(jwtKey []byte) string {
	now := time.Now()
	if t.ExpiresAt == 0 {
		t.ExpiresAt = now.Add(JWT_EXP).Unix()
	}
	if t.Issuer == "" {
		t.Issuer = "tcms"
	}
	if t.IssuedAt == 0 {
		t.IssuedAt = now.Unix()
	}

	token, _ := jwt.NewWithClaims(jwt.SigningMethodHS256, &t).SignedString(jwtKey)
	return token
}

func DecodeJWT(jwtKey []byte, raw string) (*JWTClaims, error) {
	t, err := jwt.ParseWithClaims(raw, &JWTClaims{}, func(_ *jwt.Token) (interface{}, error) {
		return jwtKey, nil
	})
	if err != nil {
		return nil, err
	}
	return t.Claims.(*JWTClaims), nil
}
