package dev.lions.unionflow.server.client;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import jakarta.ws.rs.client.ClientRequestContext;
import jakarta.ws.rs.core.MultivaluedHashMap;
import jakarta.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URI;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * Test SANS @QuarkusTest pour couvrir la branche {@code securityIdentity == null}
 * dans {@link JwtPropagationFilter#filter} (L29).
 *
 * <p>En contexte CDI, {@code securityIdentity} est toujours un proxy non-null.
 * Cette branche n'est atteignable qu'en instanciant {@link JwtPropagationFilter} directement
 * et en laissant le champ à {@code null} (valeur par défaut Java).
 */
class JwtPropagationFilterNullIdentityTest {

    private ClientRequestContext buildMockContext() {
        MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
        ClientRequestContext ctx = mock(ClientRequestContext.class);
        when(ctx.getHeaders()).thenReturn(headers);
        when(ctx.getUri()).thenReturn(URI.create("http://localhost/api/test"));
        return ctx;
    }

    @Test
    @DisplayName("filter : securityIdentity null → warn 'Pas de SecurityIdentity', pas de header Authorization (branche null L29)")
    void filter_securityIdentityNull_doesNotPropagate() throws Exception {
        // Instanciation directe — securityIdentity reste null (champ non injecté)
        JwtPropagationFilter filter = new JwtPropagationFilter();
        // securityIdentity est null par défaut (pas d'injection CDI)

        // Vérifie que le champ est bien null
        Field siField = JwtPropagationFilter.class.getDeclaredField("securityIdentity");
        siField.setAccessible(true);
        assertThat(siField.get(filter)).isNull();

        ClientRequestContext ctx = buildMockContext();
        filter.filter(ctx); // ne doit pas lever d'exception

        // Pas de header Authorization ajouté
        assertThat(ctx.getHeaders().getFirst("Authorization")).isNull();
    }
}
