package dev.lions.unionflow.server.resource;

import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.equalTo;
import static org.mockito.Mockito.when;

import dev.lions.unionflow.server.api.dto.dashboard.MembreDashboardSyntheseResponse;
import dev.lions.unionflow.server.service.MembreDashboardService;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.security.TestSecurity;
import java.math.BigDecimal;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * Tests mock pour MembreDashboardResource — couvre la branche de succès getMonDashboard.
 */
@QuarkusTest
@DisplayName("MembreDashboardResource (mock)")
class MembreDashboardMockResourceTest {

    @InjectMock
    MembreDashboardService dashboardService;

    @Test
    @TestSecurity(user = "membre@unionflow.com", roles = {"MEMBRE"})
    @DisplayName("GET /api/dashboard/membre/me — retourne 200 quand service OK")
    void getMonDashboard_success_returns200() {
        MembreDashboardSyntheseResponse synthese = new MembreDashboardSyntheseResponse(
                "Amadou",        // prenom
                "Diallo",        // nom
                null,            // dateInscription
                BigDecimal.ZERO, // mesCotisationsPaiement
                BigDecimal.ZERO, // totalCotisationsPayeesAnnee
                BigDecimal.ZERO, // totalCotisationsPayeesToutTemps
                0,               // nombreCotisationsPayees
                "A_JOUR",        // statutCotisations
                100,             // tauxCotisationsPerso
                1,               // nombreCotisationsTotal
                BigDecimal.ZERO, // monSoldeEpargne
                BigDecimal.ZERO, // evolutionEpargneNombre
                "stable",        // evolutionEpargne
                0,               // objectifEpargne
                0,               // mesEvenementsInscrits
                0,               // evenementsAVenir
                0,               // tauxParticipationPerso
                0,               // mesDemandesAide
                0,               // aidesEnCours
                0                // tauxAidesApprouvees
        );
        when(dashboardService.getDashboardData()).thenReturn(synthese);

        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(200);
    }

    // =========================================================================
    // Error cases
    // =========================================================================

    @Test
    @DisplayName("GET /api/dashboard/membre/me sans authentification retourne 401")
    void getMonDashboard_sansAuthentification_returns401() {
        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(anyOf(equalTo(401), equalTo(403)));
    }

    @Test
    @TestSecurity(user = "membre@unionflow.com", roles = {"MEMBRE"})
    @DisplayName("GET /api/dashboard/membre/me quand service lève exception retourne 500")
    void getMonDashboard_serviceException_returns500() {
        when(dashboardService.getDashboardData())
                .thenThrow(new RuntimeException("Erreur interne dashboard"));

        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(500);
    }

    @Test
    @TestSecurity(user = "admin@unionflow.com", roles = {"ADMIN"})
    @DisplayName("GET /api/dashboard/membre/me avec rôle ADMIN retourne 403")
    void getMonDashboard_avecRoleAdmin_returns403() {
        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(403);
    }
}
