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

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 StatutValidationEtape")
class StatutValidationEtapeTest {

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

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

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      StatutValidationEtape[] values = StatutValidationEtape.values();
      assertThat(values).hasSize(5);
      assertThat(values).containsExactly(
          StatutValidationEtape.EN_ATTENTE,
          StatutValidationEtape.APPROUVEE,
          StatutValidationEtape.REJETEE,
          StatutValidationEtape.DELEGUEE,
          StatutValidationEtape.EXPIREE);
    }

    @Test
    @DisplayName("Test valueOf - toutes les constantes")
    void testValueOf() {
      assertThat(StatutValidationEtape.valueOf("EN_ATTENTE")).isEqualTo(StatutValidationEtape.EN_ATTENTE);
      assertThat(StatutValidationEtape.valueOf("APPROUVEE")).isEqualTo(StatutValidationEtape.APPROUVEE);
      assertThat(StatutValidationEtape.valueOf("REJETEE")).isEqualTo(StatutValidationEtape.REJETEE);
      assertThat(StatutValidationEtape.valueOf("DELEGUEE")).isEqualTo(StatutValidationEtape.DELEGUEE);
      assertThat(StatutValidationEtape.valueOf("EXPIREE")).isEqualTo(StatutValidationEtape.EXPIREE);

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

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

    @Test
    @DisplayName("Test getLibelle valeurs exactes")
    void testGetLibelleValeursExactes() {
      assertThat(StatutValidationEtape.EN_ATTENTE.getLibelle()).isEqualTo("En attente du valideur");
      assertThat(StatutValidationEtape.APPROUVEE.getLibelle()).isEqualTo("Approuvée");
      assertThat(StatutValidationEtape.REJETEE.getLibelle()).isEqualTo("Rejetée");
      assertThat(StatutValidationEtape.DELEGUEE.getLibelle()).contains("Déléguée");
      assertThat(StatutValidationEtape.EXPIREE.getLibelle()).contains("Expirée");
    }

    @Test
    @DisplayName("Test name()")
    void testName() {
      assertThat(StatutValidationEtape.EN_ATTENTE.name()).isEqualTo("EN_ATTENTE");
      assertThat(StatutValidationEtape.APPROUVEE.name()).isEqualTo("APPROUVEE");
    }
  }
}
