package com.astalange.web.controller;

import com.astalange.core.entity.AppUser;
import com.astalange.core.entity.Role;
import com.astalange.core.repository.AppUserRepository;
import com.astalange.core.repository.RoleRepository;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;
import java.util.Set;

@Controller
@RequestMapping("/utilisateurs")
public class UtilisateurController {

    private final AppUserRepository userRepository;
    private final RoleRepository roleRepository;
    private final PasswordEncoder passwordEncoder;

    public UtilisateurController(AppUserRepository userRepository, RoleRepository roleRepository, PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.roleRepository = roleRepository;
        this.passwordEncoder = passwordEncoder;
    }

    @GetMapping
    public String listUsers(Model model) {
        List<AppUser> users = userRepository.findAll();
        model.addAttribute("users", users);
        return "utilisateurs/list";
    }

    @GetMapping("/ajouter")
    public String showAddForm(Model model) {
        model.addAttribute("username", "");
        model.addAttribute("defaultPassword", "AsTalange123");
        model.addAttribute("roles", roleRepository.findAll());
        return "utilisateurs/form";
    }

    @PostMapping("/ajouter")
    public String addUser(
            @RequestParam String username,
            @RequestParam String password,
            @RequestParam Long roleId,
            RedirectAttributes redirectAttributes,
            Model model) {

        if (userRepository.findByUsername(username).isPresent()) {
            model.addAttribute("error", "Nom d'utilisateur déjà utilisé.");
            model.addAttribute("username", username);
            model.addAttribute("defaultPassword", password);
            model.addAttribute("roles", roleRepository.findAll());
            return "utilisateurs/form";
        }

        Role role = roleRepository.findById(roleId)
                .orElseThrow(() -> new IllegalArgumentException("Rôle invalide: " + roleId));

        AppUser appUser = new AppUser();
        appUser.setUsername(username);
        appUser.setPassword(passwordEncoder.encode(password));
        appUser.setEnabled(true);
        appUser.setMustChangePassword(true);
        appUser.setRoles(Set.of(role));

        userRepository.save(appUser);

        redirectAttributes.addFlashAttribute("success", "Utilisateur créé avec succès !");
        return "redirect:/utilisateurs";
    }

    @PostMapping("/{id}/delete")
    public String deleteUser(@PathVariable Long id, RedirectAttributes redirectAttributes) {
        AppUser appUser = userRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("Utilisateur non trouvé"));

        org.springframework.security.core.Authentication auth = org.springframework.security.core.context.SecurityContextHolder.getContext().getAuthentication();
        if (auth != null && auth.getName().equals(appUser.getUsername())) {
            redirectAttributes.addFlashAttribute("error", "Vous ne pouvez pas supprimer votre propre compte.");
            return "redirect:/utilisateurs";
        }

        userRepository.delete(appUser);
        redirectAttributes.addFlashAttribute("success", "Utilisateur supprimé avec succès.");
        return "redirect:/utilisateurs";
    }
}
