package dev.lions.unionflow.client.security;

import dev.lions.unionflow.client.view.UserSession;
import jakarta.inject.Inject;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.logging.Logger;

/**
 * Filtre d'authentification pour vérifications supplémentaires
 * Note: Avec Keycloak OIDC, l'authentification principale est gérée par Quarkus
 * Ce filtre peut être utilisé pour des vérifications de permissions
 * supplémentaires
 * 
 * @author UnionFlow Team
 * @version 2.0
 */
@WebFilter(urlPatterns = { "/pages/secure/*", "/pages/admin/*", "/pages/super-admin/*", "/pages/membre/*" })
public class AuthenticationFilter implements Filter {

    private static final Logger LOGGER = Logger.getLogger(AuthenticationFilter.class.getName());

    @Inject
    private UserSession userSession;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        String requestURI = httpRequest.getRequestURI();

        // Vérifier l'authentification
        if (!isAuthenticated()) {
            // Requête AJAX PrimeFaces (partial/ajax) : on ne peut pas rediriger avec un 302 HTTP.
            // On retourne une réponse XML partial-response qui force PrimeFaces à recharger la page.
            if ("partial/ajax".equals(httpRequest.getHeader("Faces-Request"))) {
                String loginUrl = httpRequest.getContextPath() + "/login";
                httpResponse.setContentType("text/xml;charset=UTF-8");
                httpResponse.setHeader("Cache-Control", "no-cache");
                try {
                    httpResponse.getWriter().printf(
                        "<?xml version='1.0' encoding='UTF-8'?>"
                        + "<partial-response id='j_id1'><redirect url='%s'></redirect></partial-response>",
                        loginUrl);
                } catch (IOException e) {
                    LOGGER.warning("Impossible d'écrire la réponse AJAX de redirection: " + e.getMessage());
                }
                return;
            }
            // Requête pleine page : Quarkus OIDC gère la redirection vers Keycloak
            LOGGER.fine("Requête non authentifiée sur " + requestURI + ", délégation à Quarkus OIDC.");
            chain.doFilter(request, response);
            return;
        }

        // Vérifier les autorisations spécifiques basées sur les rôles
        // Note: /pages/secure/access-denied.xhtml est autorisé car elle fait partie de
        // /pages/secure/
        // qui est accessible à tous les utilisateurs authentifiés
        if (!hasRequiredPermissions(requestURI)) {
            // SÉCURITÉ: Ne pas logger les informations utilisateur sensibles
            LOGGER.warning("Tentative d'accès non-autorisé à une ressource protégée");
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/pages/secure/access-denied.xhtml");
            return;
        }

        // Continuer la chaîne de filtres
        chain.doFilter(request, response);
    }

    private boolean isAuthenticated() {
        // Avec Keycloak OIDC, UserSession vérifie automatiquement l'authentification
        // via SecurityIdentity
        return userSession != null && userSession.isAuthenticated();
    }

    private boolean hasRequiredPermissions(String requestURI) {
        // Vérifier que userSession est disponible
        if (userSession == null) {
            LOGGER.warning("UserSession est null lors de la vérification des permissions pour: " + requestURI);
            return false;
        }

        // Pages super-admin : nécessitent le rôle SUPER_ADMIN
        if (requestURI.contains("/pages/super-admin/")) {
            return userSession.isSuperAdmin();
        }

        // Pages admin : nécessitent ADMIN_ORGANISATION ou SUPER_ADMIN
        if (requestURI.contains("/pages/admin/")) {
            return userSession.isAdmin();
        }

        // Pages admin dans le dossier secure : nécessitent également ADMIN_ORGANISATION ou SUPER_ADMIN
        if (requestURI.contains("/pages/secure/admin/")) {
            return userSession.isAdmin();
        }

        // Pages membre : nécessitent le rôle MEMBRE ou tout utilisateur authentifié
        if (requestURI.contains("/pages/membre/")) {
            return userSession.isMembre();
        }

        // Pages sécurisées générales - tout utilisateur authentifié peut y accéder
        if (requestURI.contains("/pages/secure/")) {
            LOGGER.fine("Accès autorisé à la page sécurisée générale: " + requestURI);
            return true;
        }

        LOGGER.warning("URI non reconnue dans hasRequiredPermissions: " + requestURI);
        return false;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        LOGGER.info("Filtre d'authentification initialisé");
    }

    @Override
    public void destroy() {
        LOGGER.info("Filtre d'authentification détruit");
    }
}
