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

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.MultivaluedHashMap;
import jakarta.ws.rs.core.MultivaluedMap;
import org.eclipse.microprofile.jwt.JsonWebToken;
import org.eclipse.microprofile.rest.client.ext.ClientHeadersFactory;

import java.util.logging.Logger;

/**
 * Factory pour ajouter automatiquement le token OIDC Bearer
 * dans les headers des requêtes REST Client vers le backend.
 *
 * Ce factory est nécessaire car bearer-token-propagation ne fonctionne pas
 * pour les appels depuis les managed beans JSF vers le backend.
 *
 * @author Lions User Manager
 * @version 1.0.0
 */
@ApplicationScoped
public class AuthHeaderFactory implements ClientHeadersFactory {

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

    @Inject
    JsonWebToken jwt;

    @Override
    public MultivaluedMap<String, String> update(
            MultivaluedMap<String, String> incomingHeaders,
            MultivaluedMap<String, String> clientOutgoingHeaders) {

        MultivaluedMap<String, String> result = new MultivaluedHashMap<>();

        try {
            // Vérifier si le JWT est disponible et non expiré
            if (jwt != null && jwt.getRawToken() != null && !jwt.getRawToken().isEmpty()) {
                String token = jwt.getRawToken();
                result.add("Authorization", "Bearer " + token);
                LOGGER.fine("Token Bearer ajouté au header Authorization");
            } else {
                LOGGER.warning("Token JWT non disponible ou vide - impossible d'ajouter le header Authorization");
            }
        } catch (Exception e) {
            LOGGER.severe("Erreur lors de l'ajout du token Bearer: " + e.getMessage());
        }

        return result;
    }
}
