package dev.lions.unionflow.server.api.dto.organisation;

import static org.assertj.core.api.Assertions.assertThat;

import dev.lions.unionflow.server.api.enums.organisation.StatutOrganisation;
import dev.lions.unionflow.server.api.enums.organisation.TypeOrganisation;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * Tests unitaires simples pour OrganisationDTO
 *
 * @author UnionFlow Team
 * @version 2.0
 * @since 2025-01-16
 */
@DisplayName("Tests OrganisationDTO")
class OrganisationDTOSimpleTest {

  private OrganisationDTO organisation;

  @BeforeEach
  void setUp() {
    organisation = new OrganisationDTO();
  }

  @Test
  @DisplayName("Test création et getters/setters de base")
  void testCreationEtGettersSetters() {
    // Données de test
    String nom = "Lions Club Dakar";
    String nomCourt = "LCD";
    String description = "Club service de Dakar";
    StatutOrganisation statut = StatutOrganisation.ACTIVE;
    TypeOrganisation typeOrganisation = TypeOrganisation.LIONS_CLUB;
    String adresse = "Avenue Bourguiba, Dakar";
    String telephone = "+221 33 123 45 67";
    String email = "contact@lionsclubdakar.sn";

    // Test des setters
    organisation.setNom(nom);
    organisation.setNomCourt(nomCourt);
    organisation.setDescription(description);
    organisation.setStatut(statut);
    organisation.setTypeOrganisation(typeOrganisation);
    organisation.setAdresse(adresse);
    organisation.setTelephone(telephone);
    organisation.setEmail(email);

    // Test des getters
    assertThat(organisation.getNom()).isEqualTo(nom);
    assertThat(organisation.getNomCourt()).isEqualTo(nomCourt);
    assertThat(organisation.getDescription()).isEqualTo(description);
    assertThat(organisation.getStatut()).isEqualTo(statut);
    assertThat(organisation.getTypeOrganisation()).isEqualTo(typeOrganisation);
    assertThat(organisation.getAdresse()).isEqualTo(adresse);
    assertThat(organisation.getTelephone()).isEqualTo(telephone);
    assertThat(organisation.getEmail()).isEqualTo(email);
  }

  @Test
  @DisplayName("Test méthodes utilitaires ajoutées")
  void testMethodesUtilitaires() {
    organisation.setStatut(StatutOrganisation.ACTIVE);
    organisation.setTypeOrganisation(TypeOrganisation.LIONS_CLUB);

    // Test des méthodes getLibelle
    assertThat(organisation.getStatutLibelle()).isNotNull();
    assertThat(organisation.getTypeLibelle()).isNotNull();
  }

  @Test
  @DisplayName("Test validation des énumérations")
  void testValidationEnumerations() {
    // Test que toutes les énumérations sont bien supportées
    for (StatutOrganisation statut : StatutOrganisation.values()) {
      organisation.setStatut(statut);
      assertThat(organisation.getStatut()).isEqualTo(statut);
    }

    for (TypeOrganisation type : TypeOrganisation.values()) {
      organisation.setTypeOrganisation(type);
      assertThat(organisation.getTypeOrganisation()).isEqualTo(type);
    }
  }

  @Test
  @DisplayName("Test héritage BaseDTO")
  void testHeritageBaseDTO() {
    assertThat(organisation.getId()).isNotNull();
    assertThat(organisation.getDateCreation()).isNotNull();
    assertThat(organisation.isActif()).isTrue();
    assertThat(organisation.getVersion()).isEqualTo(0L);
  }
}
