package login

import (
	"app/shelfly/internal/jwt"
	"app/shelfly/internal/models"
	"encoding/json"
	"fmt"
	"net/http"

	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

func LoginHandler(db *gorm.DB) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
   
	var u =models.User{}
	var user =models.User{}
	json.NewDecoder(r.Body).Decode(&u)
	fmt.Printf("The user request value %v", u)
	fmt.Println(u.Email)
	user=u;

	d :=db.Where("Email = ?", u.Email).First(&user)
	if d.Error != nil {
		fmt.Println("Erreur lors de la requête :", d.Error)
	} else {
		// Afficher les données récupérées
		fmt.Printf("Utilisateur trouvé : %+v\n", user)
	}

	if u.Email != user.Email {
		// Handle email mismatch
		fmt.Fprint(w, "Invalid credentials")
		w.WriteHeader(http.StatusUnauthorized)

		return 
	}

	if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(u.Password)); err != nil {
		fmt.Fprint(w, "Invalid credentials")
		w.WriteHeader(http.StatusUnauthorized)
		return
	}
	tokenString, err := jwt.CreateToken(user.Username)
	  if err != nil {
		 w.WriteHeader(http.StatusInternalServerError)
		 fmt.Errorf("No username found")
	   }

	   // 4. Configurer un cookie HTTP-only
	   http.SetCookie(w, &http.Cookie{
		Name:     "token",
		Value:    tokenString,
		Path:     "/",   
		HttpOnly: true,  // Empêche l’accès via JS (mitige XSS)
		Secure:   false, // Passez à true en HTTPS 
		// SameSite et Domain peuvent être précisés selon votre config
	})

	// 5. Réponse JSON (optionnel)
	w.Header().Add("Hx-Redirect", "/dashboard")
	w.WriteHeader(http.StatusOK)
	w.Write([]byte(`{"message": "Connected"}`))
	 
	  return
	
  }}

  func LoginHandlerApi(db *gorm.DB) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")

		// 1. Lire les données JSON envoyées par Flutter
		var input struct {
			Email    string `json:"email"`
			Password string `json:"password"`
		}
		if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
			http.Error(w, `{"error":"Invalid JSON format"}`, http.StatusBadRequest)
			return
		}

		// 2. Rechercher l'utilisateur en base
		var user models.User
		if err := db.Where("email = ?", input.Email).First(&user).Error; err != nil {
			w.WriteHeader(http.StatusUnauthorized)
			json.NewEncoder(w).Encode(map[string]string{
				"error": "Invalid email or password",
			})
			return
		}

		// 3. Comparer le mot de passe
		if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(input.Password)); err != nil {
			w.WriteHeader(http.StatusUnauthorized)
			json.NewEncoder(w).Encode(map[string]string{
				"error": "Invalid email or password",
			})
			return
		}

		// 4. Créer un token JWT
		tokenString, err := jwt.CreateToken(user.Username) // à adapter selon ta fonction
		if err != nil {
			w.WriteHeader(http.StatusInternalServerError)
			json.NewEncoder(w).Encode(map[string]string{
				"error": "Failed to generate token",
			})
			return
		}

		// 5. Répondre en JSON pour Flutter
		w.WriteHeader(http.StatusOK)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"user": map[string]interface{}{
				"id":       user.ID,
				"username": user.Username,
				"email":    user.Email,
				"token":   tokenString,
				"password" : input.Password
				// ajoute d'autres infos utiles ici si nécessaire
			},
		})
	}
}
