package jwt

import (
	"fmt"
	"net/http"
	"time"
	"github.com/golang-jwt/jwt/v5"
)

/*
   Dans le snippet de code ci-dessus, nous importons les colis nécessaires,
   y compris github.com/golang-jwt/jwt/v5.
   Nous créons un nouveau jeton JWT en utilisant le jwt.NewWithClaims()fonction.
   Nous spécifions la méthode de signature comme HS256 et des informations pertinentes telles que le nom d'utilisateur
   et la date d'expiration du jeton. Ensuite, nous signons le jeton avec une clé secrète et retournons
   le jeton généré comme une chaîne.
*/
   var secretKey = []byte("secret-key")
   
   func CreateToken(username string) (string, error) {
	   token := jwt.NewWithClaims(jwt.SigningMethodHS256, 
		   jwt.MapClaims{ 
		   "username": username, 
		   "exp": time.Now().Add(time.Hour * 24).Unix(), 
		   })
		
	   tokenString, err := token.SignedString(secretKey)
	   if err != nil {
	   return "", err
	   }
	   fmt.Sprintf(tokenString)
	return tokenString, nil
   }


   /*
   Dans le snippet de code ci-dessus, nous utilisons le jwt.Parse()fonctionner pour
    analyser et vérifier le jeton. Nous fournissons une fonction de rappel pour récupérer 
	la clé secrète utilisée pour signer le jeton. Si le jeton est valide, nous continuons à traiter la demande; 
	sinon, nous renvoyons une erreur indiquant que le jeton est invalide.
   */
   func verifyToken(tokenString string) error {
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
	   return secretKey, nil
	})
   
	if err != nil {
	   return err
	}
   
	if !token.Valid {
	   return fmt.Errorf("invalid token")
	}
   
	return nil
 }



  func ProtectedHandler(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	tokenString := r.Header.Get("Authorization")
	if tokenString == "" {
	  w.WriteHeader(http.StatusUnauthorized)
	  fmt.Fprint(w, "Missing authorization header")
	  return
	}
	tokenString = tokenString[len("Bearer "):]
	
	err := verifyToken(tokenString)
	if err != nil {
	  w.WriteHeader(http.StatusUnauthorized)
	  fmt.Fprint(w, "Invalid token")
	  return
	}
	
	fmt.Fprint(w, "Welcome to the the protected area")
	
  }