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 java.math.BigDecimal;
import java.time.LocalDate;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

/**
 * Tests unitaires complets pour OrganisationDTO.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-01-10
 */
@DisplayName("Tests OrganisationDTO")
class OrganisationDTOBasicTest {

  private OrganisationDTO organisation;

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

  @Nested
  @DisplayName("Tests de Construction")
  class ConstructionTests {

    @Test
    @DisplayName("Constructeur par défaut - Initialisation correcte")
    void testConstructeurParDefaut() {
      OrganisationDTO newOrganisation = new OrganisationDTO();

      assertThat(newOrganisation.getId()).isNotNull();
      assertThat(newOrganisation.getDateCreation()).isNotNull();
      assertThat(newOrganisation.isActif()).isTrue();
      assertThat(newOrganisation.getVersion()).isEqualTo(0L);
      assertThat(newOrganisation.getStatut()).isEqualTo(StatutOrganisation.ACTIVE);
      assertThat(newOrganisation.getNombreMembres()).isEqualTo(0);
      assertThat(newOrganisation.getNombreAdministrateurs()).isEqualTo(0);
      assertThat(newOrganisation.getBudgetAnnuel()).isNull();
    }

    @Test
    @DisplayName("Constructeur avec paramètres - Initialisation correcte")
    void testConstructeurAvecParametres() {
      String nom = "Lions Club Dakar";
      TypeOrganisation type = TypeOrganisation.LIONS_CLUB;

      OrganisationDTO newOrganisation = new OrganisationDTO(nom, type);

      assertThat(newOrganisation.getNom()).isEqualTo(nom);
      assertThat(newOrganisation.getTypeOrganisation()).isEqualTo(type);
      assertThat(newOrganisation.getStatut()).isEqualTo(StatutOrganisation.ACTIVE);
    }
  }

  @Nested
  @DisplayName("Tests Getters/Setters")
  class GettersSettersTests {

    @Test
    @DisplayName("Test tous les getters/setters - Partie 1")
    void testTousLesGettersSettersPart1() {
      // Données de test
      String nom = "Lions Club Dakar";
      String nomCourt = "LCD";
      TypeOrganisation typeOrganisation = TypeOrganisation.LIONS_CLUB;
      StatutOrganisation statut = StatutOrganisation.ACTIVE;
      String numeroEnregistrement = "REG-2025-001";
      LocalDate dateFondation = LocalDate.of(2020, 1, 15);
      String description = "Club service Lions de Dakar";
      String adresse = "123 Avenue Bourguiba";
      String ville = "Dakar";
      String region = "Dakar";
      String pays = "Sénégal";
      String codePostal = "10000";
      String telephone = "+221338234567";
      String email = "contact@lionsclubdakar.sn";
      String siteWeb = "https://lionsclubdakar.sn";

      // Test des setters
      organisation.setNom(nom);
      organisation.setNomCourt(nomCourt);
      organisation.setTypeOrganisation(typeOrganisation);
      organisation.setStatut(statut);
      organisation.setNumeroEnregistrement(numeroEnregistrement);
      organisation.setDateFondation(dateFondation);
      organisation.setDescription(description);
      organisation.setAdresse(adresse);
      organisation.setVille(ville);
      organisation.setRegion(region);
      organisation.setPays(pays);
      organisation.setCodePostal(codePostal);
      organisation.setTelephone(telephone);
      organisation.setEmail(email);
      organisation.setSiteWeb(siteWeb);

      // Test des getters
      assertThat(organisation.getNom()).isEqualTo(nom);
      assertThat(organisation.getNomCourt()).isEqualTo(nomCourt);
      assertThat(organisation.getTypeOrganisation()).isEqualTo(typeOrganisation);
      assertThat(organisation.getStatut()).isEqualTo(statut);
      assertThat(organisation.getNumeroEnregistrement()).isEqualTo(numeroEnregistrement);
      assertThat(organisation.getDateFondation()).isEqualTo(dateFondation);
      assertThat(organisation.getDescription()).isEqualTo(description);
      assertThat(organisation.getAdresse()).isEqualTo(adresse);
      assertThat(organisation.getVille()).isEqualTo(ville);
      assertThat(organisation.getRegion()).isEqualTo(region);
      assertThat(organisation.getPays()).isEqualTo(pays);
      assertThat(organisation.getCodePostal()).isEqualTo(codePostal);
      assertThat(organisation.getTelephone()).isEqualTo(telephone);
      assertThat(organisation.getEmail()).isEqualTo(email);
      assertThat(organisation.getSiteWeb()).isEqualTo(siteWeb);
    }

    @Test
    @DisplayName("Test getters/setters - Géolocalisation et hiérarchie")
    void testGettersSettersGeolocalisationHierarchie() {
      // Données de test
      BigDecimal latitude = new BigDecimal("14.6937");
      BigDecimal longitude = new BigDecimal("-17.4441");
      UUID organisationParenteId = UUID.randomUUID();
      String nomOrganisationParente = "Lions District 403";
      Integer niveauHierarchique = 2;
      Integer nombreMembres = 50;
      Integer nombreAdministrateurs = 5;
      BigDecimal budgetAnnuel = new BigDecimal("5000000.00");
      String devise = "XOF";

      // Test des setters
      organisation.setLatitude(latitude);
      organisation.setLongitude(longitude);
      organisation.setOrganisationParenteId(organisationParenteId);
      organisation.setNomOrganisationParente(nomOrganisationParente);
      organisation.setNiveauHierarchique(niveauHierarchique);
      organisation.setNombreMembres(nombreMembres);
      organisation.setNombreAdministrateurs(nombreAdministrateurs);
      organisation.setBudgetAnnuel(budgetAnnuel);
      organisation.setDevise(devise);

      // Test des getters
      assertThat(organisation.getLatitude()).isEqualTo(latitude);
      assertThat(organisation.getLongitude()).isEqualTo(longitude);
      assertThat(organisation.getOrganisationParenteId()).isEqualTo(organisationParenteId);
      assertThat(organisation.getNomOrganisationParente()).isEqualTo(nomOrganisationParente);
      assertThat(organisation.getNiveauHierarchique()).isEqualTo(niveauHierarchique);
      assertThat(organisation.getNombreMembres()).isEqualTo(nombreMembres);
      assertThat(organisation.getNombreAdministrateurs()).isEqualTo(nombreAdministrateurs);
      assertThat(organisation.getBudgetAnnuel()).isEqualTo(budgetAnnuel);
      assertThat(organisation.getDevise()).isEqualTo(devise);
    }

    @Test
    @DisplayName("Test getters/setters - Informations complémentaires")
    void testGettersSettersInformationsComplementaires() {
      // Données de test
      String objectifs = "Servir la communauté";
      String activitesPrincipales = "Actions sociales, environnement";
      String reseauxSociaux = "{\"facebook\":\"@lionsclub\"}";
      String certifications = "ISO 9001";
      String partenaires = "UNICEF, Croix-Rouge";
      String notes = "Notes administratives";
      Boolean organisationPublique = true;
      Boolean accepteNouveauxMembres = true;
      Boolean cotisationObligatoire = true;
      BigDecimal montantCotisationAnnuelle = new BigDecimal("50000.00");

      // Test des setters
      organisation.setObjectifs(objectifs);
      organisation.setActivitesPrincipales(activitesPrincipales);
      organisation.setReseauxSociaux(reseauxSociaux);
      organisation.setCertifications(certifications);
      organisation.setPartenaires(partenaires);
      organisation.setNotes(notes);
      organisation.setOrganisationPublique(organisationPublique);
      organisation.setAccepteNouveauxMembres(accepteNouveauxMembres);
      organisation.setCotisationObligatoire(cotisationObligatoire);
      organisation.setMontantCotisationAnnuelle(montantCotisationAnnuelle);

      // Test des getters
      assertThat(organisation.getObjectifs()).isEqualTo(objectifs);
      assertThat(organisation.getActivitesPrincipales()).isEqualTo(activitesPrincipales);
      assertThat(organisation.getReseauxSociaux()).isEqualTo(reseauxSociaux);
      assertThat(organisation.getCertifications()).isEqualTo(certifications);
      assertThat(organisation.getPartenaires()).isEqualTo(partenaires);
      assertThat(organisation.getNotes()).isEqualTo(notes);
      assertThat(organisation.getOrganisationPublique()).isEqualTo(organisationPublique);
      assertThat(organisation.getAccepteNouveauxMembres()).isEqualTo(accepteNouveauxMembres);
      assertThat(organisation.getCotisationObligatoire()).isEqualTo(cotisationObligatoire);
      assertThat(organisation.getMontantCotisationAnnuelle()).isEqualTo(montantCotisationAnnuelle);
    }

    @Test
    @DisplayName("Test tous les getters/setters - Partie 2")
    void testTousLesGettersSettersPart2() {
      // Données de test
      UUID organisationParenteId = UUID.randomUUID();
      String nomOrganisationParente = "Lions District 403";
      Integer nombreMembres = 45;
      Integer nombreAdministrateurs = 7;
      BigDecimal budgetAnnuel = new BigDecimal("5000000.00");
      String devise = "XOF";
      BigDecimal latitude = new BigDecimal("14.6937");
      BigDecimal longitude = new BigDecimal("-17.4441");
      String telephoneSecondaire = "+221338765432";
      String emailSecondaire = "info@lionsclubdakar.sn";
      String logo = "logo_lions_dakar.png";
      Integer niveauHierarchique = 2;

      // Test des setters
      organisation.setOrganisationParenteId(organisationParenteId);
      organisation.setNomOrganisationParente(nomOrganisationParente);
      organisation.setNombreMembres(nombreMembres);
      organisation.setNombreAdministrateurs(nombreAdministrateurs);
      organisation.setBudgetAnnuel(budgetAnnuel);
      organisation.setDevise(devise);
      organisation.setLatitude(latitude);
      organisation.setLongitude(longitude);
      organisation.setTelephoneSecondaire(telephoneSecondaire);
      organisation.setEmailSecondaire(emailSecondaire);
      organisation.setLogo(logo);
      organisation.setNiveauHierarchique(niveauHierarchique);

      // Test des getters
      assertThat(organisation.getOrganisationParenteId()).isEqualTo(organisationParenteId);
      assertThat(organisation.getNomOrganisationParente()).isEqualTo(nomOrganisationParente);
      assertThat(organisation.getNombreMembres()).isEqualTo(nombreMembres);
      assertThat(organisation.getNombreAdministrateurs()).isEqualTo(nombreAdministrateurs);
      assertThat(organisation.getBudgetAnnuel()).isEqualTo(budgetAnnuel);
      assertThat(organisation.getDevise()).isEqualTo(devise);
      assertThat(organisation.getLatitude()).isEqualTo(latitude);
      assertThat(organisation.getLongitude()).isEqualTo(longitude);
      assertThat(organisation.getTelephoneSecondaire()).isEqualTo(telephoneSecondaire);
      assertThat(organisation.getEmailSecondaire()).isEqualTo(emailSecondaire);
      assertThat(organisation.getLogo()).isEqualTo(logo);
      assertThat(organisation.getNiveauHierarchique()).isEqualTo(niveauHierarchique);
    }
  }



  @Nested
  @DisplayName("Tests des méthodes métier")
  class MethodesMetierTests {

    @Test
    @DisplayName("Test méthodes de statut")
    void testMethodesStatut() {
      // Test isActive
      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.isActive()).isTrue();

      organisation.setStatut(StatutOrganisation.INACTIVE);
      assertThat(organisation.isActive()).isFalse();

      // Test isInactive
      organisation.setStatut(StatutOrganisation.INACTIVE);
      assertThat(organisation.isInactive()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.isInactive()).isFalse();

      // Test isSuspendue
      organisation.setStatut(StatutOrganisation.SUSPENDUE);
      assertThat(organisation.isSuspendue()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.isSuspendue()).isFalse();

      // Test isEnCreation
      organisation.setStatut(StatutOrganisation.EN_CREATION);
      assertThat(organisation.isEnCreation()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.isEnCreation()).isFalse();

      // Test isDissoute
      organisation.setStatut(StatutOrganisation.DISSOUTE);
      assertThat(organisation.isDissoute()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.isDissoute()).isFalse();
    }

    @Test
    @DisplayName("Test calculs d'ancienneté")
    void testCalculsAnciennete() {
      // Cas sans date de fondation
      organisation.setDateFondation(null);
      assertThat(organisation.getAncienneteAnnees()).isEqualTo(0);
      assertThat(organisation.getAncienneteMois()).isEqualTo(0);

      // Cas avec date de fondation il y a 5 ans
      LocalDate dateFondation = LocalDate.now().minusYears(5).minusMonths(3);
      organisation.setDateFondation(dateFondation);
      assertThat(organisation.getAncienneteAnnees()).isEqualTo(5);
      assertThat(organisation.getAncienneteMois()).isEqualTo(63); // 5*12 + 3

      // Cas avec date de fondation récente (moins d'un an)
      dateFondation = LocalDate.now().minusMonths(8);
      organisation.setDateFondation(dateFondation);
      assertThat(organisation.getAncienneteAnnees()).isEqualTo(0);
      assertThat(organisation.getAncienneteMois()).isEqualTo(8);
    }

    @Test
    @DisplayName("Test hasGeolocalisation")
    void testHasGeolocalisation() {
      // Cas sans géolocalisation
      organisation.setLatitude(null);
      organisation.setLongitude(null);
      assertThat(organisation.hasGeolocalisation()).isFalse();

      // Cas avec latitude seulement
      organisation.setLatitude(new BigDecimal("14.6937"));
      organisation.setLongitude(null);
      assertThat(organisation.hasGeolocalisation()).isFalse();

      // Cas avec longitude seulement
      organisation.setLatitude(null);
      organisation.setLongitude(new BigDecimal("-17.4441"));
      assertThat(organisation.hasGeolocalisation()).isFalse();

      // Cas avec géolocalisation complète
      organisation.setLatitude(new BigDecimal("14.6937"));
      organisation.setLongitude(new BigDecimal("-17.4441"));
      assertThat(organisation.hasGeolocalisation()).isTrue();
    }

    @Test
    @DisplayName("Test hiérarchie")
    void testHierarchie() {
      // Test isOrganisationRacine
      organisation.setOrganisationParenteId(null);
      assertThat(organisation.isOrganisationRacine()).isTrue();

      organisation.setOrganisationParenteId(UUID.randomUUID());
      assertThat(organisation.isOrganisationRacine()).isFalse();

      // Test hasSousOrganisations
      organisation.setNiveauHierarchique(null);
      assertThat(organisation.hasSousOrganisations()).isFalse();

      organisation.setNiveauHierarchique(0);
      assertThat(organisation.hasSousOrganisations()).isFalse();

      organisation.setNiveauHierarchique(1);
      assertThat(organisation.hasSousOrganisations()).isTrue();

      organisation.setNiveauHierarchique(3);
      assertThat(organisation.hasSousOrganisations()).isTrue();
    }

    @Test
    @DisplayName("Test getNomAffichage")
    void testGetNomAffichage() {
      String nomComplet = "Lions Club Dakar Plateau";
      String nomCourt = "LCD Plateau";

      // Cas avec nom court
      organisation.setNom(nomComplet);
      organisation.setNomCourt(nomCourt);
      assertThat(organisation.getNomAffichage()).isEqualTo(nomCourt);

      // Cas avec nom court vide
      organisation.setNomCourt("");
      assertThat(organisation.getNomAffichage()).isEqualTo(nomComplet);

      // Cas avec nom court null
      organisation.setNomCourt(null);
      assertThat(organisation.getNomAffichage()).isEqualTo(nomComplet);

      // Cas avec nom court contenant seulement des espaces
      organisation.setNomCourt("   ");
      assertThat(organisation.getNomAffichage()).isEqualTo(nomComplet);
    }

    @Test
    @DisplayName("Test getAdresseComplete")
    void testGetAdresseComplete() {
      // Cas avec adresse complète
      organisation.setAdresse("123 Avenue Bourguiba");
      organisation.setVille("Dakar");
      organisation.setCodePostal("10000");
      organisation.setRegion("Dakar");
      organisation.setPays("Sénégal");

      String adresseComplete = organisation.getAdresseComplete();
      assertThat(adresseComplete).contains("123 Avenue Bourguiba");
      assertThat(adresseComplete).contains("Dakar");
      assertThat(adresseComplete).contains("10000");
      assertThat(adresseComplete).contains("Sénégal");

      // Cas avec adresse partielle
      organisation.setAdresse("123 Avenue Bourguiba");
      organisation.setVille("Dakar");
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays(null);

      adresseComplete = organisation.getAdresseComplete();
      assertThat(adresseComplete).isEqualTo("123 Avenue Bourguiba, Dakar");

      // Cas avec adresse vide
      organisation.setAdresse(null);
      organisation.setVille(null);
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays(null);

      adresseComplete = organisation.getAdresseComplete();
      assertThat(adresseComplete).isEmpty();
    }

    @Test
    @DisplayName("Test getRatioAdministrateurs")
    void testGetRatioAdministrateurs() {
      // Cas sans membres
      organisation.setNombreMembres(null);
      organisation.setNombreAdministrateurs(5);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(0.0);

      organisation.setNombreMembres(0);
      organisation.setNombreAdministrateurs(5);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(0.0);

      // Cas sans administrateurs
      organisation.setNombreMembres(100);
      organisation.setNombreAdministrateurs(null);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(0.0);

      // Cas normal
      organisation.setNombreMembres(100);
      organisation.setNombreAdministrateurs(10);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(10.0);

      organisation.setNombreMembres(50);
      organisation.setNombreAdministrateurs(5);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(10.0);
    }

    @Test
    @DisplayName("Test hasBudget")
    void testHasBudget() {
      // Cas sans budget
      organisation.setBudgetAnnuel(null);
      assertThat(organisation.hasBudget()).isFalse();

      // Cas avec budget zéro
      organisation.setBudgetAnnuel(BigDecimal.ZERO);
      assertThat(organisation.hasBudget()).isFalse();

      // Cas avec budget négatif
      organisation.setBudgetAnnuel(new BigDecimal("-1000.00"));
      assertThat(organisation.hasBudget()).isFalse();

      // Cas avec budget positif
      organisation.setBudgetAnnuel(new BigDecimal("5000000.00"));
      assertThat(organisation.hasBudget()).isTrue();
    }

    @Test
    @DisplayName("Test méthodes d'action")
    void testMethodesAction() {
      String utilisateur = "admin";

      // Test activer
      organisation.setStatut(StatutOrganisation.INACTIVE);
      organisation.activer(utilisateur);
      assertThat(organisation.getStatut()).isEqualTo(StatutOrganisation.ACTIVE);

      // Test suspendre
      organisation.setStatut(StatutOrganisation.ACTIVE);
      organisation.suspendre(utilisateur);
      assertThat(organisation.getStatut()).isEqualTo(StatutOrganisation.SUSPENDUE);

      // Test dissoudre
      organisation.setStatut(StatutOrganisation.ACTIVE);
      organisation.setAccepteNouveauxMembres(true);
      organisation.dissoudre(utilisateur);
      assertThat(organisation.getStatut()).isEqualTo(StatutOrganisation.DISSOUTE);
      assertThat(organisation.getAccepteNouveauxMembres()).isFalse();
    }

    @Test
    @DisplayName("Test gestion des membres")
    void testGestionMembres() {
      String utilisateur = "admin";

      // Test mettreAJourNombreMembres
      organisation.mettreAJourNombreMembres(50, utilisateur);
      assertThat(organisation.getNombreMembres()).isEqualTo(50);

      // Test ajouterMembre
      organisation.setNombreMembres(null);
      organisation.ajouterMembre(utilisateur);
      assertThat(organisation.getNombreMembres()).isEqualTo(1);

      organisation.ajouterMembre(utilisateur);
      assertThat(organisation.getNombreMembres()).isEqualTo(2);

      // Test retirerMembre
      organisation.setNombreMembres(5);
      organisation.retirerMembre(utilisateur);
      assertThat(organisation.getNombreMembres()).isEqualTo(4);

      // Test retirerMembre avec 0 membres
      organisation.setNombreMembres(0);
      organisation.retirerMembre(utilisateur);
      assertThat(organisation.getNombreMembres()).isEqualTo(0);

      // Test retirerMembre avec null
      organisation.setNombreMembres(null);
      organisation.retirerMembre(utilisateur);
      assertThat(organisation.getNombreMembres()).isNull();
    }

    @Test
    @DisplayName("Test toString")
    void testToString() {
      organisation.setNom("Lions Club Dakar");
      organisation.setNomCourt("LCD");
      organisation.setTypeOrganisation(TypeOrganisation.LIONS_CLUB);
      organisation.setStatut(StatutOrganisation.ACTIVE);
      organisation.setVille("Dakar");
      organisation.setPays("Sénégal");
      organisation.setNombreMembres(50);
      organisation.setDateFondation(LocalDate.of(2020, 1, 15));

      String result = organisation.toString();
      assertThat(result).isNotNull();
      assertThat(result).contains("OrganisationDTO");
      assertThat(result).contains("nom='Lions Club Dakar'");
      assertThat(result).contains("nomCourt='LCD'");
      assertThat(result).contains("typeOrganisation=LIONS_CLUB");
      assertThat(result).contains("statut=ACTIVE");
      assertThat(result).contains("ville='Dakar'");
      assertThat(result).contains("pays='Sénégal'");
      assertThat(result).contains("nombreMembres=50");
      assertThat(result).contains("anciennete=" + organisation.getAncienneteAnnees() + " ans");
    }

    @Test
    @DisplayName("Test branches supplémentaires getAdresseComplete")
    void testBranchesSupplementairesAdresseComplete() {
      // Test avec ville seulement (sans adresse)
      organisation.setAdresse(null);
      organisation.setVille("Dakar");
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays(null);
      assertThat(organisation.getAdresseComplete()).isEqualTo("Dakar");

      // Test avec code postal seulement (sans adresse ni ville)
      organisation.setAdresse(null);
      organisation.setVille(null);
      organisation.setCodePostal("12000");
      organisation.setRegion(null);
      organisation.setPays(null);
      assertThat(organisation.getAdresseComplete()).isEqualTo("12000");

      // Test avec région seulement
      organisation.setAdresse(null);
      organisation.setVille(null);
      organisation.setCodePostal(null);
      organisation.setRegion("Dakar");
      organisation.setPays(null);
      assertThat(organisation.getAdresseComplete()).isEqualTo("Dakar");

      // Test avec pays seulement
      organisation.setAdresse(null);
      organisation.setVille(null);
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays("Sénégal");
      assertThat(organisation.getAdresseComplete()).isEqualTo("Sénégal");

      // Test avec ville et code postal (sans adresse)
      organisation.setAdresse(null);
      organisation.setVille("Dakar");
      organisation.setCodePostal("12000");
      organisation.setRegion(null);
      organisation.setPays(null);
      assertThat(organisation.getAdresseComplete()).isEqualTo("Dakar 12000");

      // Test avec ville et région (sans adresse)
      organisation.setAdresse(null);
      organisation.setVille("Dakar");
      organisation.setCodePostal(null);
      organisation.setRegion("Dakar");
      organisation.setPays(null);
      assertThat(organisation.getAdresseComplete()).isEqualTo("Dakar, Dakar");

      // Test avec ville et pays (sans adresse)
      organisation.setAdresse(null);
      organisation.setVille("Dakar");
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays("Sénégal");
      assertThat(organisation.getAdresseComplete()).isEqualTo("Dakar, Sénégal");
    }
  }
}
