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.CsvSource;
import org.junit.jupiter.params.provider.EnumSource;

@DisplayName("Tests pour StatutMembre")
class StatutMembreTest {

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

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

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      StatutMembre[] values = StatutMembre.values();
      assertThat(values).hasSize(8);
      assertThat(values).contains(
          StatutMembre.EN_ATTENTE_VALIDATION,
          StatutMembre.ACTIF,
          StatutMembre.INACTIF,
          StatutMembre.SUSPENDU,
          StatutMembre.DEMISSIONNAIRE,
          StatutMembre.RADIE,
          StatutMembre.HONORAIRE,
          StatutMembre.DECEDE);
    }

    @Test
    @DisplayName("Test valueOf")
    void testValueOf() {
      assertThat(StatutMembre.valueOf("ACTIF")).isEqualTo(StatutMembre.ACTIF);
      assertThat(StatutMembre.valueOf("INACTIF")).isEqualTo(StatutMembre.INACTIF);
      assertThat(StatutMembre.valueOf("SUSPENDU")).isEqualTo(StatutMembre.SUSPENDU);
      assertThat(StatutMembre.valueOf("RADIE")).isEqualTo(StatutMembre.RADIE);

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

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

    @Test
    @DisplayName("Test getLibelle avec valeurs exactes")
    void testGetLibelleValeursExactes() {
      assertThat(StatutMembre.ACTIF.getLibelle()).isEqualTo("Actif");
      assertThat(StatutMembre.INACTIF.getLibelle()).contains("Inactif");
      assertThat(StatutMembre.SUSPENDU.getLibelle()).contains("Suspendu");
      assertThat(StatutMembre.RADIE.getLibelle()).contains("Radié");
    }

    @Test
    @DisplayName("Test ordinal et name")
    void testOrdinalEtName() {
      assertThat(StatutMembre.EN_ATTENTE_VALIDATION.name()).isEqualTo("EN_ATTENTE_VALIDATION");
      assertThat(StatutMembre.ACTIF.name()).isEqualTo("ACTIF");
      assertThat(StatutMembre.INACTIF.name()).isEqualTo("INACTIF");
      assertThat(StatutMembre.SUSPENDU.name()).isEqualTo("SUSPENDU");
      assertThat(StatutMembre.RADIE.name()).isEqualTo("RADIE");
      assertThat(StatutMembre.DEMISSIONNAIRE.name()).isEqualTo("DEMISSIONNAIRE");
      assertThat(StatutMembre.HONORAIRE.name()).isEqualTo("HONORAIRE");
      assertThat(StatutMembre.DECEDE.name()).isEqualTo("DECEDE");
    }
  }
}

