package dev.lions.unionflow.server.service.support;

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import dev.lions.unionflow.server.repository.MembreRepository;
import io.quarkus.security.identity.SecurityIdentity;
import jakarta.ws.rs.NotFoundException;
import java.lang.reflect.Field;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * Test SANS @QuarkusTest pour couvrir la branche {@code email.isBlank()}
 * dans {@link SecuriteHelper#resolveMembreId()} (L71).
 *
 * <p>La branche {@code email.isBlank()} dans {@code if (email == null || email.isBlank())}
 * n'est pas atteignable via le flux normal car {@link SecuriteHelper#resolveEmail()}
 * retourne toujours null (jamais un String blank) quand le nom principal est blank.
 *
 * <p>On couvre cette branche en sous-classant {@link SecuriteHelper} et en surchargeant
 * {@code resolveEmail()} pour retourner une chaîne blank, puis en appelant
 * {@code resolveMembreId()} directement.
 */
class SecuriteHelperResolveMembreIdBlankEmailTest {

    /**
     * Sous-classe de test qui force {@code resolveEmail()} à retourner un String blank.
     */
    private static class SecuriteHelperBlankEmailStub extends SecuriteHelper {
        @Override
        public String resolveEmail() {
            return "   "; // blank non-null → couvre email.isBlank() branch dans resolveMembreId()
        }
    }

    @Test
    @DisplayName("resolveMembreId : email blank → NotFoundException (branche email.isBlank() L71)")
    void resolveMembreId_emailBlank_throwsNotFoundException() throws Exception {
        SecuriteHelperBlankEmailStub stub = new SecuriteHelperBlankEmailStub();

        // Injecter les dépendances nécessaires via réflexion (jamais appelées car
        // resolveEmail() est court-circuité par la surcharge)
        SecurityIdentity mockSi = mock(SecurityIdentity.class);
        when(mockSi.isAnonymous()).thenReturn(false);

        MembreRepository mockRepo = mock(MembreRepository.class);

        Field siField = SecuriteHelper.class.getDeclaredField("securityIdentity");
        siField.setAccessible(true);
        siField.set(stub, mockSi);

        Field repoField = SecuriteHelper.class.getDeclaredField("membreRepository");
        repoField.setAccessible(true);
        repoField.set(stub, mockRepo);

        // email = "   " → isBlank() = true → throw NotFoundException
        assertThatThrownBy(() -> stub.resolveMembreId())
            .isInstanceOf(NotFoundException.class)
            .hasMessageContaining("Identité non disponible");
    }
}
