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

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 TypeFormule")
class TypeFormuleTest {

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

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

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      TypeFormule[] values = TypeFormule.values();
      assertThat(values).hasSize(4);
      assertThat(values).containsExactly(
          TypeFormule.BASIC,
          TypeFormule.STANDARD,
          TypeFormule.PREMIUM,
          TypeFormule.ENTERPRISE);
    }

    @Test
    @DisplayName("Test valueOf")
    void testValueOf() {
      assertThat(TypeFormule.valueOf("BASIC")).isEqualTo(TypeFormule.BASIC);
      assertThat(TypeFormule.valueOf("STANDARD")).isEqualTo(TypeFormule.STANDARD);
      assertThat(TypeFormule.valueOf("PREMIUM")).isEqualTo(TypeFormule.PREMIUM);
      assertThat(TypeFormule.valueOf("ENTERPRISE")).isEqualTo(TypeFormule.ENTERPRISE);

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

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

    @ParameterizedTest
    @CsvSource({
        "BASIC, Formule Basique",
        "STANDARD, Formule Standard",
        "PREMIUM, Formule Premium",
        "ENTERPRISE, Formule Entreprise"
    })
    @DisplayName("Test getLibelle avec valeurs exactes")
    void testGetLibelleValeursExactes(TypeFormule type, String expectedLibelle) {
      assertThat(type.getLibelle()).isEqualTo(expectedLibelle);
    }
  }
}

