package dev.lions.user.manager.security;

import jakarta.annotation.Priority;
import jakarta.inject.Inject;
import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.core.SecurityContext;
import jakarta.ws.rs.ext.Provider;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.jboss.logging.Logger;

import java.security.Principal;

/**
 * Filtre JAX-RS pour remplacer le SecurityContext en mode développement
 * En dev, remplace le SecurityContext par un mock qui autorise tous les rôles
 * En prod, laisse le SecurityContext réel de Quarkus
 */
@Provider
@Priority(Priorities.AUTHENTICATION - 1) // S'exécute avant l'authentification
public class DevSecurityContextProducer implements ContainerRequestFilter {

    private static final Logger LOG = Logger.getLogger(DevSecurityContextProducer.class);

    @Inject
    @ConfigProperty(name = "quarkus.profile", defaultValue = "prod")
    String profile;

    @Override
    public void filter(ContainerRequestContext requestContext) {
        // En dev, remplacer le SecurityContext par un mock
        if ("dev".equals(profile) || "development".equals(profile)) {
            LOG.debug("Mode dev: remplacement du SecurityContext par un mock avec tous les rôles");
            SecurityContext original = requestContext.getSecurityContext();
            requestContext.setSecurityContext(new DevSecurityContext(original));
        }
    }

    /**
     * SecurityContext mock pour le mode développement
     * Simule un utilisateur avec tous les rôles nécessaires
     */
    private static class DevSecurityContext implements SecurityContext {
        
        private final SecurityContext original;
        private final Principal principal = new Principal() {
            @Override
            public String getName() {
                return "dev-user";
            }
        };

        public DevSecurityContext(SecurityContext original) {
            this.original = original;
        }

        @Override
        public Principal getUserPrincipal() {
            return principal;
        }

        @Override
        public boolean isUserInRole(String role) {
            // En dev, autoriser tous les rôles
            return true;
        }

        @Override
        public boolean isSecure() {
            return original != null ? original.isSecure() : false;
        }

        @Override
        public String getAuthenticationScheme() {
            return "DEV";
        }
    }
}

