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

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 StatutCotisation")
class StatutCotisationTest {

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

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

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      StatutCotisation[] values = StatutCotisation.values();
      assertThat(values).hasSize(6);
      assertThat(values).containsExactly(
          StatutCotisation.EN_ATTENTE,
          StatutCotisation.PAYEE,
          StatutCotisation.PARTIELLEMENT_PAYEE,
          StatutCotisation.EN_RETARD,
          StatutCotisation.ANNULEE,
          StatutCotisation.REMBOURSEE);
    }

    @Test
    @DisplayName("Test valueOf")
    void testValueOf() {
      assertThat(StatutCotisation.valueOf("EN_ATTENTE")).isEqualTo(StatutCotisation.EN_ATTENTE);
      assertThat(StatutCotisation.valueOf("PAYEE")).isEqualTo(StatutCotisation.PAYEE);
      assertThat(StatutCotisation.valueOf("PARTIELLEMENT_PAYEE")).isEqualTo(StatutCotisation.PARTIELLEMENT_PAYEE);
      assertThat(StatutCotisation.valueOf("EN_RETARD")).isEqualTo(StatutCotisation.EN_RETARD);
      assertThat(StatutCotisation.valueOf("ANNULEE")).isEqualTo(StatutCotisation.ANNULEE);
      assertThat(StatutCotisation.valueOf("REMBOURSEE")).isEqualTo(StatutCotisation.REMBOURSEE);

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

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

    @ParameterizedTest
    @CsvSource({
        "EN_ATTENTE, En attente",
        "PAYEE, Payée",
        "PARTIELLEMENT_PAYEE, Partiellement payée",
        "EN_RETARD, En retard",
        "ANNULEE, Annulée",
        "REMBOURSEE, Remboursée"
    })
    @DisplayName("Test getLibelle avec valeurs exactes")
    void testGetLibelleValeursExactes(StatutCotisation statut, String expectedLibelle) {
      assertThat(statut.getLibelle()).isEqualTo(expectedLibelle);
    }
  }
}

