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

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 StatutTraitement")
class StatutTraitementTest {

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

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      StatutTraitement[] values = StatutTraitement.values();
      assertThat(values).hasSize(5);
      assertThat(values).containsExactly(
          StatutTraitement.RECU,
          StatutTraitement.EN_COURS,
          StatutTraitement.TRAITE,
          StatutTraitement.ECHEC,
          StatutTraitement.IGNORE);
    }

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

    @ParameterizedTest
    @CsvSource({
        "RECU, Reçu",
        "EN_COURS, En cours de traitement",
        "TRAITE, Traité avec succès",
        "ECHEC, Échec de traitement",
        "IGNORE, Ignoré"
    })
    @DisplayName("Test getLibelle avec valeurs exactes")
    void testGetLibelleValeursExactes(StatutTraitement statut, String expectedLibelle) {
      assertThat(statut.getLibelle()).isEqualTo(expectedLibelle);
    }
  }
}

