package dev.lions.unionflow.client.view;

import jakarta.enterprise.context.RequestScoped;
import jakarta.faces.context.ExternalContext;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import org.eclipse.microprofile.jwt.JsonWebToken;
import java.io.IOException;
import java.io.Serializable;
import java.util.logging.Logger;

/**
 * Bean de gestion de l'authentification via Keycloak OIDC
 * 
 * @author UnionFlow Team
 * @version 2.0
 */
@Named("loginBean")
@RequestScoped
public class LoginBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(LoginBean.class.getName());
    
    @Inject
    private JsonWebToken jwt;
    
    @Inject
    private UserSession userSession;
    
    /**
     * Redirige vers Keycloak pour l'authentification
     * L'authentification est gérée automatiquement par Quarkus OIDC
     */
    public void login() {
        try {
            // La redirection vers Keycloak est gérée automatiquement par Quarkus OIDC
            // via la configuration dans application.properties
            LOGGER.info("Redirection vers Keycloak pour l'authentification");
        } catch (Exception e) {
            LOGGER.severe("Erreur lors de la redirection vers Keycloak: " + e.getMessage());
        }
    }
    
    /**
     * Déconnexion de l'utilisateur
     * Redirige vers l'endpoint de déconnexion Keycloak
     */
    public String logout() {
        try {
            // Nettoyer la session locale
            userSession.clearSession();
            
            // Invalider la session JSF
            FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
            
            LOGGER.info("Déconnexion réussie");
            
            // Redirection vers Keycloak pour la déconnexion complète
            ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
            String logoutUrl = "/auth/logout";
            externalContext.redirect(logoutUrl);
            
            return null; // La redirection est gérée par redirect()
            
        } catch (IOException e) {
            LOGGER.warning("Erreur lors de la déconnexion: " + e.getMessage());
            
            // Même en cas d'erreur, invalider la session locale
            userSession.clearSession();
            FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
            
            return "/?faces-redirect=true";
        }
    }
    
    /**
     * Vérifie si l'utilisateur est authentifié
     */
    public boolean isAuthenticated() {
        return jwt != null && jwt.getName() != null;
    }
}