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

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 TypeEvenementMetier")
class TypeEvenementMetierTest {

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

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

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      TypeEvenementMetier[] values = TypeEvenementMetier.values();
      assertThat(values).hasSize(9);
      assertThat(values).containsExactly(
          TypeEvenementMetier.ASSEMBLEE_GENERALE,
          TypeEvenementMetier.FORMATION,
          TypeEvenementMetier.ACTIVITE_SOCIALE,
          TypeEvenementMetier.ACTION_CARITATIVE,
          TypeEvenementMetier.REUNION_BUREAU,
          TypeEvenementMetier.CONFERENCE,
          TypeEvenementMetier.ATELIER,
          TypeEvenementMetier.CEREMONIE,
          TypeEvenementMetier.AUTRE);
    }

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

    @ParameterizedTest
    @CsvSource({
        "ASSEMBLEE_GENERALE, Assemblée Générale",
        "FORMATION, Formation",
        "ACTIVITE_SOCIALE, Activité Sociale",
        "ACTION_CARITATIVE, Action Caritative",
        "REUNION_BUREAU, Réunion de Bureau",
        "CONFERENCE, Conférence",
        "ATELIER, Atelier",
        "CEREMONIE, Cérémonie",
        "AUTRE, Autre"
    })
    @DisplayName("Test getLibelle avec valeurs exactes")
    void testGetLibelleValeursExactes(TypeEvenementMetier type, String expectedLibelle) {
      assertThat(type.getLibelle()).isEqualTo(expectedLibelle);
    }
  }
}

