package core

import (
	"github.com/golang-jwt/jwt/v5"
)

type JWTClaims struct {
	jwt.RegisteredClaims
	AccountId int `json:"account_id"`
	RoleId    int `json:"role_id"`
}

var jwtSecret string

func InitJWT(secret string) {
	jwtSecret = secret
}

func SignJWT(claims JWTClaims) (string, error) {
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	return token.SignedString([]byte(jwtSecret))
}

func VerifyJWT(token string) (JWTClaims, *HTTPError) {
	parsedClaims := JWTClaims{}
	claims, err := jwt.ParseWithClaims(token, &parsedClaims, func(token *jwt.Token) (any, error) {
		return []byte(jwtSecret), nil
	})

	if err != nil {
		return JWTClaims{}, NewInternalServerError(err)
	}

	if !claims.Valid {
		return JWTClaims{}, ErrInvalidToken
	}

	return parsedClaims, nil
}