package dev.lions.user.manager.client.view;

import dev.lions.user.manager.client.service.UserServiceClient;
import dev.lions.user.manager.dto.user.UserDTO;
import dev.lions.user.manager.enums.user.StatutUser;
import jakarta.annotation.PostConstruct;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import lombok.Data;
import org.eclipse.microprofile.rest.client.inject.RestClient;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * Bean JSF pour la création d'un nouvel utilisateur
 * 
 * @author Lions User Manager
 * @version 1.0.0
 */
@Named("userCreationBean")
@ViewScoped
@Data
public class UserCreationBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(UserCreationBean.class.getName());

    @Inject
    @RestClient
    private UserServiceClient userServiceClient;

    private UserDTO newUser = UserDTO.builder().build();
    // Le realm "master" est le realm d'administration qui permet de gérer tous les
    // autres realms
    private String realmName = "master";
    private String password;
    private String passwordConfirm;

    // Options pour les selects
    private List<StatutUser> statutOptions = List.of(StatutUser.values());
    private List<String> availableRealms = new ArrayList<>();

    @PostConstruct
    public void init() {
        loadRealms();
        // Initialiser les valeurs par défaut
        newUser.setEnabled(true);
        newUser.setEmailVerified(false);
        newUser.setStatut(StatutUser.ACTIF);
    }

    /**
     * Créer un nouvel utilisateur
     */
    public String createUser() {
        // Validation
        if (password == null || password.isEmpty()) {
            addErrorMessage("Le mot de passe est obligatoire");
            return null;
        }

        if (!password.equals(passwordConfirm)) {
            addErrorMessage("Les mots de passe ne correspondent pas");
            return null;
        }

        if (password.length() < 8) {
            addErrorMessage("Le mot de passe doit contenir au moins 8 caractères");
            return null;
        }

        try {
            // Créer l'utilisateur
            jakarta.ws.rs.core.Response response = userServiceClient.createUser(newUser, realmName);
            UserDTO createdUser = response.readEntity(UserDTO.class);

            // Définir le mot de passe
            dev.lions.user.manager.dto.user.PasswordResetRequestDTO request = new dev.lions.user.manager.dto.user.PasswordResetRequestDTO(
                    password, false);
            userServiceClient.resetPassword(createdUser.getId(), realmName, request);

            addSuccessMessage("Utilisateur créé avec succès: " + createdUser.getUsername());
            resetForm();
            return "userListPage"; // Rediriger vers la liste
        } catch (Exception e) {
            LOGGER.severe("Erreur lors de la création: " + e.getMessage());
            addErrorMessage("Erreur lors de la création: " + e.getMessage());
            return null;
        }
    }

    /**
     * Réinitialiser le formulaire
     */
    public void resetForm() {
        newUser = UserDTO.builder().build();
        password = null;
        passwordConfirm = null;
        newUser.setEnabled(true);
        newUser.setEmailVerified(false);
        newUser.setStatut(StatutUser.ACTIF);
    }

    /**
     * Annuler la création
     */
    public String cancel() {
        resetForm();
        return "userListPage";
    }

    /**
     * Charger les realms disponibles
     */
    private void loadRealms() {
        // TODO: Implémenter la récupération des realms depuis Keycloak
        // Le realm "master" est le realm d'administration qui permet de gérer tous les
        // autres realms
        availableRealms = List.of("master", "lions-user-manager", "btpxpress", "unionflow");
    }

    // Méthodes utilitaires
    private void addSuccessMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO, "Succès", message));
    }

    private void addErrorMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", message));
    }
}
