package fr.eni.enchere.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.BindingResult;
import fr.eni.enchere.bll.UserService;
import fr.eni.enchere.bo.UserProfil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/inscription")
public class InscriptionController {

    @Autowired
    private final UserService userService;
    private PasswordEncoder passwordEncoder;

    public InscriptionController(UserService userService, PasswordEncoder passwordEncoder) {
        this.userService = userService;
        this.passwordEncoder = passwordEncoder;
    }

    @GetMapping
    public String viewInscription(Model model) {
        model.addAttribute("user", new UserProfil());
        return "inscription";
    }

    @PostMapping("/newUser")
    public String setUser(@ModelAttribute("userProfile") UserProfil userProfile, BindingResult result) {
        // Obtenez l'authentification actuelle
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // Vérifiez si l'utilisateur est authentifié
        if (!authentication.getName().equals("anonymousUser")) {
            // Obtenez les détails de l'utilisateur authentifié
            String username = authentication.getName();
            // Utilisez le service approprié pour récupérer les informations de l'utilisateur à partir du nom d'utilisateur
            UserProfil currentUserProfile = userService.utilisateurByName(username);
            // Vérifiez si le mot de passe actuel correspond à celui stocké dans la base de données
            if (!passwordEncoder.matches(userProfile.getNewPassword(), currentUserProfile.getPassword())) {
                // Mot de passe actuel incorrect, renvoyer une erreur
                result.rejectValue("currentPassword", "invalid", "Mot de passe actuel incorrect");
                return "editProfil"; // Rediriger vers la page de modification du profil avec une erreur
            }
            // Vérifiez si le nouveau mot de passe et sa confirmation correspondent
            if (!userProfile.getNewPassword().equals(userProfile.getConfirmPassword())) {
                // Mauvaise correspondance entre le nouveau mot de passe et sa confirmation, renvoyer une erreur
                result.rejectValue("confirmPassword", "invalid", "La confirmation du mot de passe ne correspond pas au nouveau mot de passe");
                return "editProfil"; // Rediriger vers la page de modification du profil avec une erreur
            }
            // Mettez à jour le mot de passe de l'utilisateur avec le nouveau mot de passe
            userService.setUtilisateur(currentUserProfile);
            return "redirect:/profil"; // Rediriger vers la page de profil après la modification réussie
        } else {
            return "accueil";
        }
    }

}
