package dev.lions.unionflow.server.api;

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

import dev.lions.unionflow.server.api.dto.evenement.response.EvenementResponse;
import dev.lions.unionflow.server.api.dto.solidarite.response.DemandeAideResponse;
import dev.lions.unionflow.server.api.dto.solidarite.response.PropositionAideResponse;

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 dev.lions.unionflow.server.api.validation.ValidationConstants;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.UUID;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * Test de compilation pour vérifier que tous les DTOs compilent correctement
 *
 * @author UnionFlow Team
 * @version 2.0
 * @since 2025-01-16
 */
@DisplayName("Tests de Compilation")
class CompilationTest {

  @Test
  @DisplayName("Test compilation EvenementResponse")
  void testCompilationEvenementResponse() {
    EvenementResponse evenement = new EvenementResponse();
    evenement.setTitre("Test Formation");
    evenement.setStatut(StatutEvenement.PLANIFIE);
    evenement.setPriorite(PrioriteEvenement.NORMALE);
    evenement.setTypeEvenement(TypeEvenementMetier.FORMATION);
    evenement.setDateDebut(LocalDate.now().plusDays(30));

    // Test des méthodes métier
    assertThat(evenement.estEnCours()).isFalse();
    assertThat(evenement.getStatutLibelle()).isEqualTo("Planifié");
    assertThat(evenement.getTypeEvenementLibelle()).isEqualTo("Formation");

    // Test des setters
    evenement.setStatut(StatutEvenement.CONFIRME);
    assertThat(evenement.getStatut()).isEqualTo(StatutEvenement.CONFIRME);
  }

  @Test
  @DisplayName("Test compilation DemandeAideResponse")
  void testCompilationDemandeAideResponse() {
    DemandeAideResponse demande = new DemandeAideResponse();
    demande.setTitre("Test Demande");
    demande.setMontantDemande(new BigDecimal("50000"));

    // Test des méthodes métier
    assertThat(demande.getId()).isNull();
    assertThat(demande.getVersion()).isNull(); // Unset version is null in BaseResponse

    // Test des setters
    demande.setCreePar("testUser");
    assertThat(demande.getCreePar()).isEqualTo("testUser");
  }

  @Test
  @DisplayName("Test compilation PropositionAideResponse")
  void testCompilationPropositionAideResponse() {
    PropositionAideResponse proposition = new PropositionAideResponse();
    proposition.setTitre("Test Proposition");
    proposition.setMontantMaximum(new BigDecimal("100000"));

    // Vérifier que le type est correct
    assertThat(proposition.getMontantMaximum()).isInstanceOf(BigDecimal.class);
  }

  @Test
  @DisplayName("Test compilation ValidationConstants")
  void testCompilationValidationConstants() {
    // Test que les constantes sont accessibles
    assertThat(ValidationConstants.TITRE_MIN_LENGTH).isEqualTo(5);
    assertThat(ValidationConstants.TITRE_MAX_LENGTH).isEqualTo(100);
    assertThat(ValidationConstants.TELEPHONE_PATTERN).isNotNull();
    assertThat(ValidationConstants.DEVISE_PATTERN).isNotNull();
  }

  @Test
  @DisplayName("Test compilation énumérations")
  void testCompilationEnumerations() {
    // Test StatutEvenement
    StatutEvenement statut = StatutEvenement.PLANIFIE;
    assertThat(statut.getLibelle()).isEqualTo("Planifié");
    assertThat(statut.permetModification()).isTrue();

    // Test PrioriteEvenement
    PrioriteEvenement priorite = PrioriteEvenement.HAUTE;
    assertThat(priorite.getLibelle()).isEqualTo("Haute");
    assertThat(priorite.isUrgente()).isTrue(); // Amélioration TDD : HAUTE est maintenant urgente

    // Test TypeEvenementMetier
    TypeEvenementMetier type = TypeEvenementMetier.FORMATION;
    assertThat(type.getLibelle()).isEqualTo("Formation");
  }

  @Test
  @DisplayName("Test intégration complète")
  void testIntegrationComplete() {
    // Créer un événement complet
    EvenementResponse evenement = new EvenementResponse();
    evenement.setTitre("Formation Leadership");
    evenement.setTypeEvenement(TypeEvenementMetier.FORMATION);
    evenement.setDateDebut(LocalDate.now().plusDays(30));
    evenement.setLieu("Centre de Formation");
    evenement.setStatut(StatutEvenement.PLANIFIE);
    evenement.setPriorite(PrioriteEvenement.HAUTE);
    evenement.setCapaciteMax(50);
    evenement.setParticipantsInscrits(0);
    evenement.setBudget(new BigDecimal("500000"));
    evenement.setCodeDevise("XOF");
    evenement.setAssociationId(UUID.randomUUID());

    // Vérifier que tout fonctionne
    assertThat(evenement.estEnCours()).isFalse();
    assertThat(evenement.estComplet()).isFalse();
    assertThat(evenement.sontInscriptionsOuvertes()).isTrue();

    // Créer une demande d'aide complète
    DemandeAideResponse demande = new DemandeAideResponse();
    demande.setTitre("Aide Médicale Urgente");
    demande.setDescription("Besoin d'aide pour frais médicaux");
    demande.setMontantDemande(new BigDecimal("250000"));
    demande.setMembreDemandeurId(UUID.randomUUID());
    demande.setAssociationId(UUID.randomUUID());

    // Vérifier que tout fonctionne
    assertThat(demande.getId()).isNull();
    assertThat(demande.getMontantDemande()).isEqualTo(new BigDecimal("250000"));
  }
}
