package dev.lions.unionflow.server.service;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static dev.lions.unionflow.server.service.MigrerOrganisationsVersKeycloakService.slugify;
import static org.assertj.core.api.Assertions.assertThat;

/**
 * Tests unitaires pour MigrerOrganisationsVersKeycloakService.
 * La migration Keycloak elle-même nécessite un Keycloak 26 actif (tests d'intégration P2.4).
 */
class MigrerOrganisationsVersKeycloakServiceTest {

    @Test
    @DisplayName("slugify — nom simple en minuscules sans accents")
    void slugify_nomSimple() {
        assertThat(slugify("Mutuelle GBANE")).isEqualTo("mutuelle-gbane");
    }

    @Test
    @DisplayName("slugify — supprime les accents")
    void slugify_accents() {
        assertThat(slugify("Coopérative d'Épargne")).isEqualTo("cooperative-depargne");
    }

    @Test
    @DisplayName("slugify — espaces multiples → tiret simple")
    void slugify_espacesMultiples() {
        assertThat(slugify("Lions  Club   Abidjan")).isEqualTo("lions-club-abidjan");
    }

    @Test
    @DisplayName("slugify — caractères spéciaux supprimés")
    void slugify_caracteresSpeciaux() {
        assertThat(slugify("Syndicat & Co. (CI)")).isEqualTo("syndicat-co-ci");
    }

    @Test
    @DisplayName("slugify — null retourne un slug non vide")
    void slugify_null_retourneSlugNonVide() {
        String result = slugify(null);
        assertThat(result).isNotNull().isNotBlank().startsWith("org-");
    }

    @Test
    @DisplayName("slugify — chaîne vide retourne un slug non vide")
    void slugify_chaineVide_retourneSlugNonVide() {
        String result = slugify("");
        assertThat(result).isNotNull().isNotBlank().startsWith("org-");
    }

    @Test
    @DisplayName("slugify — slug sans tiret en début ou fin")
    void slugify_pasDeTiretEnBordure() {
        String result = slugify("  -test- ");
        assertThat(result).doesNotStartWith("-").doesNotEndWith("-");
    }

    @Test
    @DisplayName("MigrationReport.success() — true si zéro erreurs")
    void migrationReport_success_zeroErreurs() {
        var report = new MigrerOrganisationsVersKeycloakService.MigrationReport(10, 8, 2, 0);
        assertThat(report.success()).isTrue();
    }

    @Test
    @DisplayName("MigrationReport.success() — false si erreurs > 0")
    void migrationReport_success_avecErreurs() {
        var report = new MigrerOrganisationsVersKeycloakService.MigrationReport(10, 7, 2, 1);
        assertThat(report.success()).isFalse();
    }
}
