package dev.lions.unionflow.server.api.enums.membre;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;

@DisplayName("Tests pour StatutCompteUtilisateur")
class StatutCompteUtilisateurTest {

  @Test
  @DisplayName("Test de base - enum peut être utilisé")
  void testEnumUtilisable() {
    assertThat(StatutCompteUtilisateur.ACTIF).isNotNull();
    assertThat(StatutCompteUtilisateur.EN_ATTENTE_VALIDATION).isNotNull();
  }

  @Nested
  @DisplayName("Tests des valeurs enum")
  class TestsValeursEnum {

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      StatutCompteUtilisateur[] values = StatutCompteUtilisateur.values();
      assertThat(values).hasSize(4);
      assertThat(values).containsExactly(
          StatutCompteUtilisateur.EN_ATTENTE_VALIDATION,
          StatutCompteUtilisateur.ACTIF,
          StatutCompteUtilisateur.SUSPENDU,
          StatutCompteUtilisateur.DESACTIVE);
    }

    @Test
    @DisplayName("Test valueOf - toutes les constantes")
    void testValueOf() {
      assertThat(StatutCompteUtilisateur.valueOf("EN_ATTENTE_VALIDATION")).isEqualTo(StatutCompteUtilisateur.EN_ATTENTE_VALIDATION);
      assertThat(StatutCompteUtilisateur.valueOf("ACTIF")).isEqualTo(StatutCompteUtilisateur.ACTIF);
      assertThat(StatutCompteUtilisateur.valueOf("SUSPENDU")).isEqualTo(StatutCompteUtilisateur.SUSPENDU);
      assertThat(StatutCompteUtilisateur.valueOf("DESACTIVE")).isEqualTo(StatutCompteUtilisateur.DESACTIVE);

      assertThatThrownBy(() -> StatutCompteUtilisateur.valueOf("INEXISTANT"))
          .isInstanceOf(IllegalArgumentException.class);
    }

    @ParameterizedTest
    @EnumSource(StatutCompteUtilisateur.class)
    @DisplayName("Test getLibelle pour toutes les valeurs")
    void testGetLibelle(StatutCompteUtilisateur statut) {
      assertThat(statut.getLibelle()).isNotNull().isNotEmpty();
    }

    @Test
    @DisplayName("Test getLibelle contient libellé attendu")
    void testGetLibelleContenu() {
      assertThat(StatutCompteUtilisateur.EN_ATTENTE_VALIDATION.getLibelle()).contains("En attente");
      assertThat(StatutCompteUtilisateur.ACTIF.getLibelle()).contains("Actif");
      assertThat(StatutCompteUtilisateur.SUSPENDU.getLibelle()).contains("Suspendu");
      assertThat(StatutCompteUtilisateur.DESACTIVE.getLibelle()).contains("Désactivé");
    }

    @Test
    @DisplayName("Test name()")
    void testName() {
      assertThat(StatutCompteUtilisateur.ACTIF.name()).isEqualTo("ACTIF");
      assertThat(StatutCompteUtilisateur.EN_ATTENTE_VALIDATION.name()).isEqualTo("EN_ATTENTE_VALIDATION");
    }
  }
}
