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

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 LienParente")
class LienParenteTest {

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

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

    @Test
    @DisplayName("Test toutes les valeurs enum")
    void testToutesValeurs() {
      LienParente[] values = LienParente.values();
      assertThat(values).hasSize(4);
      assertThat(values).containsExactly(
          LienParente.CONJOINT,
          LienParente.ENFANT,
          LienParente.PARENT,
          LienParente.AUTRE);
    }

    @Test
    @DisplayName("Test valueOf - toutes les constantes")
    void testValueOf() {
      assertThat(LienParente.valueOf("CONJOINT")).isEqualTo(LienParente.CONJOINT);
      assertThat(LienParente.valueOf("ENFANT")).isEqualTo(LienParente.ENFANT);
      assertThat(LienParente.valueOf("PARENT")).isEqualTo(LienParente.PARENT);
      assertThat(LienParente.valueOf("AUTRE")).isEqualTo(LienParente.AUTRE);

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

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

    @Test
    @DisplayName("Test getLibelle valeurs exactes")
    void testGetLibelleValeursExactes() {
      assertThat(LienParente.CONJOINT.getLibelle()).isEqualTo("Conjoint(e)");
      assertThat(LienParente.ENFANT.getLibelle()).isEqualTo("Enfant");
      assertThat(LienParente.PARENT.getLibelle()).isEqualTo("Parent");
      assertThat(LienParente.AUTRE.getLibelle()).isEqualTo("Autre");
    }

    @Test
    @DisplayName("Test name()")
    void testName() {
      assertThat(LienParente.CONJOINT.name()).isEqualTo("CONJOINT");
      assertThat(LienParente.AUTRE.name()).isEqualTo("AUTRE");
    }
  }
}
