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

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

import dev.lions.unionflow.server.api.enums.evenement.PrioriteEvenement;
import dev.lions.unionflow.server.api.enums.evenement.StatutEvenement;
import dev.lions.unionflow.server.api.enums.evenement.TypeEvenementMetier;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

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

  private EvenementDTO evenement;

  @BeforeEach
  void setUp() {
    evenement = new EvenementDTO();
  }

  @Test
  @DisplayName("Test création et getters/setters de base")
  void testCreationEtGettersSetters() {
    // Données de test
    String titre = "Formation Leadership";
    String description = "Formation sur les techniques de leadership";
    TypeEvenementMetier typeEvenement = TypeEvenementMetier.FORMATION;
    StatutEvenement statut = StatutEvenement.PLANIFIE;
    PrioriteEvenement priorite = PrioriteEvenement.NORMALE;
    LocalDate dateDebut = LocalDate.now().plusDays(30);
    LocalDate dateFin = LocalDate.now().plusDays(30);
    LocalTime heureDebut = LocalTime.of(9, 0);
    LocalTime heureFin = LocalTime.of(17, 0);
    String lieu = "Centre de Formation";
    Integer capaciteMax = 50;
    BigDecimal budget = new BigDecimal("500000");

    // Test des setters
    evenement.setTitre(titre);
    evenement.setDescription(description);
    evenement.setTypeEvenement(typeEvenement);
    evenement.setStatut(statut);
    evenement.setPriorite(priorite);
    evenement.setDateDebut(dateDebut);
    evenement.setDateFin(dateFin);
    evenement.setHeureDebut(heureDebut);
    evenement.setHeureFin(heureFin);
    evenement.setLieu(lieu);
    evenement.setCapaciteMax(capaciteMax);
    evenement.setBudget(budget);

    // Test des getters
    assertThat(evenement.getTitre()).isEqualTo(titre);
    assertThat(evenement.getDescription()).isEqualTo(description);
    assertThat(evenement.getTypeEvenement()).isEqualTo(typeEvenement);
    assertThat(evenement.getStatut()).isEqualTo(statut);
    assertThat(evenement.getPriorite()).isEqualTo(priorite);
    assertThat(evenement.getDateDebut()).isEqualTo(dateDebut);
    assertThat(evenement.getDateFin()).isEqualTo(dateFin);
    assertThat(evenement.getHeureDebut()).isEqualTo(heureDebut);
    assertThat(evenement.getHeureFin()).isEqualTo(heureFin);
    assertThat(evenement.getLieu()).isEqualTo(lieu);
    assertThat(evenement.getCapaciteMax()).isEqualTo(capaciteMax);
    assertThat(evenement.getBudget()).isEqualTo(budget);
  }

  @Test
  @DisplayName("Test constructeur avec paramètres")
  void testConstructeurAvecParametres() {
    String titre = "Assemblée Générale";
    TypeEvenementMetier type = TypeEvenementMetier.ASSEMBLEE_GENERALE;
    LocalDate date = LocalDate.now().plusDays(15);
    String lieu = "Salle de conférence";

    EvenementDTO newEvenement = new EvenementDTO(titre, type, date, lieu);

    assertThat(newEvenement.getTitre()).isEqualTo(titre);
    assertThat(newEvenement.getTypeEvenement()).isEqualTo(type);
    assertThat(newEvenement.getDateDebut()).isEqualTo(date);
    assertThat(newEvenement.getLieu()).isEqualTo(lieu);
    assertThat(newEvenement.getStatut()).isEqualTo(StatutEvenement.PLANIFIE);
  }

  @Test
  @DisplayName("Test méthodes utilitaires existantes")
  void testMethodesUtilitaires() {
    // Test des méthodes qui existent réellement
    evenement.setStatut(StatutEvenement.EN_COURS);
    assertThat(evenement.estEnCours()).isTrue();

    evenement.setStatut(StatutEvenement.TERMINE);
    assertThat(evenement.estTermine()).isTrue();

    evenement.setStatut(StatutEvenement.ANNULE);
    assertThat(evenement.estAnnule()).isTrue();

    // Test capacité
    evenement.setCapaciteMax(50);
    evenement.setParticipantsInscrits(25);
    assertThat(evenement.estComplet()).isFalse();
    assertThat(evenement.getPlacesDisponibles()).isEqualTo(25);
    assertThat(evenement.getTauxRemplissage()).isEqualTo(50);
  }

  @Test
  @DisplayName("Test validation des énumérations")
  void testValidationEnumerations() {
    // Test que toutes les énumérations sont bien supportées
    for (TypeEvenementMetier type : TypeEvenementMetier.values()) {
      evenement.setTypeEvenement(type);
      assertThat(evenement.getTypeEvenement()).isEqualTo(type);
    }

    for (StatutEvenement statut : StatutEvenement.values()) {
      evenement.setStatut(statut);
      assertThat(evenement.getStatut()).isEqualTo(statut);
    }

    for (PrioriteEvenement priorite : PrioriteEvenement.values()) {
      evenement.setPriorite(priorite);
      assertThat(evenement.getPriorite()).isEqualTo(priorite);
    }
  }

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