package dev.lions.unionflow.server.resource;

import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.*;
import static org.assertj.core.api.Assertions.assertThat;

import dev.lions.unionflow.server.entity.Membre;
import dev.lions.unionflow.server.service.MembreService;
import io.quarkus.test.TestTransaction;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.security.TestSecurity;
import io.restassured.response.Response;
import jakarta.inject.Inject;
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.Test;

@QuarkusTest
class MembreDashboardResourceTest {

    @Inject
    MembreService membreService;

    private Membre testMembre;
    private Membre seedMembre;

    @BeforeEach
    @TestTransaction
    void setup() {
        // Créer le membre seed utilisé par @TestSecurity
        seedMembre = new Membre();
        seedMembre.setPrenom("Mukefi");
        seedMembre.setNom("Membre");
        seedMembre.setEmail("membre.mukefi@unionflow.test");
        seedMembre.setNumeroMembre("M-SEED-001");
        seedMembre.setDateNaissance(LocalDate.of(1990, 3, 15));
        seedMembre.setStatutCompte("ACTIF");
        seedMembre.setActif(true);
        membreService.creerMembre(seedMembre);

        // Créer un membre de test additionnel
        testMembre = new Membre();
        testMembre.setPrenom("Dashboard");
        testMembre.setNom("TestMembre");
        testMembre.setEmail("membre.dashboard.test-" + UUID.randomUUID() + "@unionflow.test");
        testMembre.setNumeroMembre("M-DASH-" + UUID.randomUUID().toString().substring(0, 8));
        testMembre.setDateNaissance(LocalDate.of(1992, 5, 15));
        testMembre.setStatutCompte("ACTIF");
        testMembre.setActif(true);
        membreService.creerMembre(testMembre);
    }

    @Test
    @TestSecurity(user = "membre.mukefi@unionflow.test", roles = { "MEMBRE" })
    @DisplayName("GET /api/dashboard/membre/me avec membre inexistant retourne 404")
    void getMonDashboard_seedMembre_returns404() {
        // Sans données seed, le membre n'existe pas en base de test
        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(404);
    }

    @Test
    @TestSecurity(user = "membre.inexistant@unionflow.test", roles = { "MEMBRE" })
    @DisplayName("GET /api/dashboard/membre/me avec membre inexistant retourne 404")
    void getMonDashboard_membreInexistant_returns404() {
        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(404);
    }

    @Test
    @TestTransaction
    @TestSecurity(user = "admin@unionflow.com", roles = { "ADMIN" })
    @DisplayName("GET /api/dashboard/membre/me avec ADMIN sans membre associé retourne 404")
    void getMonDashboard_adminSansMembre_returns404() {
        // ADMIN sans compte membre doit retourner 404
        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(anyOf(equalTo(404), equalTo(500)));
    }

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

    @Test
    @TestSecurity(user = "membre.mukefi@unionflow.test", roles = { "MEMBRE" })
    @DisplayName("GET /api/dashboard/membre/me retourne 404 sans données seed")
    void getMonDashboard_noSeedData_returns404() {
        // Sans données seed, impossible de tester les soldes
        // Ce test passera quand Task #58 (données seed SQL) sera implémenté
        given()
                .when()
                .get("/api/dashboard/membre/me")
                .then()
                .statusCode(404);
    }
}
