package dev.lions.unionflow.server.service;

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

import java.lang.reflect.Field;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * Tests SANS @QuarkusTest pour couvrir les branches où {@code securityIdentity == null}
 * dans {@link KeycloakService#isAuthenticated()} (L33) et
 * {@link KeycloakService#logSecurityInfo()} (L287).
 *
 * <p>Ces branches sont inatteignables via CDI (Quarkus injecte toujours un proxy non-null).
 * On instancie {@link KeycloakService} directement et injecte les champs via réflexion.
 */
class KeycloakServiceNullBranchTest {

    /**
     * Crée une instance de {@link KeycloakService} avec {@code securityIdentity = null}
     * et un mock {@code JsonWebToken}.
     */
    private KeycloakService buildServiceWithNullIdentity() throws Exception {
        KeycloakService service = new KeycloakService();

        Field siField = KeycloakService.class.getDeclaredField("securityIdentity");
        siField.setAccessible(true);
        siField.set(service, null); // null → couvre la branche securityIdentity == null

        org.eclipse.microprofile.jwt.JsonWebToken mockJwt = mock(org.eclipse.microprofile.jwt.JsonWebToken.class);
        Field jwtField = KeycloakService.class.getDeclaredField("jwt");
        jwtField.setAccessible(true);
        jwtField.set(service, mockJwt);

        return service;
    }

    // ================================================================
    // isAuthenticated() — branche securityIdentity == null → false (L33)
    // ================================================================

    @Test
    @DisplayName("isAuthenticated : securityIdentity null → retourne false (branche null L33)")
    void isAuthenticated_securityIdentityNull_returnsFalse() throws Exception {
        KeycloakService service = buildServiceWithNullIdentity();

        // securityIdentity == null → short-circuit → false
        assertThat(service.isAuthenticated()).isFalse();
    }

    // ================================================================
    // logSecurityInfo() — branche LOG.isDebugEnabled() false (L287)
    // Via instanciation directe avec logger INFO (pas DEBUG en isolation)
    // ================================================================

    @Test
    @DisplayName("logSecurityInfo : securityIdentity null → ne lève pas d'exception")
    void logSecurityInfo_securityIdentityNull_doesNotThrow() throws Exception {
        KeycloakService service = buildServiceWithNullIdentity();

        // isAuthenticated() = false → logSecurityInfo ne plante pas
        service.logSecurityInfo();
    }
}
