package dev.lions.unionflow.server.resource;

import dev.lions.unionflow.server.api.dto.solidarite.request.CreatePropositionAideRequest;
import dev.lions.unionflow.server.api.dto.solidarite.request.UpdatePropositionAideRequest;
import dev.lions.unionflow.server.api.dto.solidarite.response.PropositionAideResponse;
import dev.lions.unionflow.server.service.PropositionAideService;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.openapi.annotations.Operation;
import org.eclipse.microprofile.openapi.annotations.tags.Tag;

import java.util.Collections;
import java.util.List;

/**
 * Resource REST pour les propositions d'aide.
 */
@Path("/api/propositions-aide")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RolesAllowed({"ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION", "MEMBRE", "USER"})
@Tag(name = "Propositions d'aide", description = "Gestion des propositions d'aide solidarité")
public class PropositionAideResource {

    @Inject
    PropositionAideService propositionAideService;

    @GET
    @Operation(summary = "Liste les propositions d'aide avec pagination")
    public List<PropositionAideResponse> listerToutes(
            @QueryParam("page") @DefaultValue("0") int page,
            @QueryParam("size") @DefaultValue("20") int size) {
        List<PropositionAideResponse> all = propositionAideService.rechercherAvecFiltres(Collections.emptyMap());
        int from = Math.min(page * size, all.size());
        int to = Math.min(from + size, all.size());
        return from < to ? all.subList(from, to) : List.of();
    }

    @GET
    @Path("/{id}")
    @Operation(summary = "Récupère une proposition d'aide par son ID")
    public PropositionAideResponse obtenirParId(@PathParam("id") String id) {
        PropositionAideResponse response = propositionAideService.obtenirParId(id);
        if (response == null) {
            throw new NotFoundException("Proposition d'aide non trouvée : " + id);
        }
        return response;
    }

    @POST
    @Operation(summary = "Crée une nouvelle proposition d'aide")
    public Response creer(@Valid CreatePropositionAideRequest request) {
        PropositionAideResponse response = propositionAideService.creerProposition(request);
        return Response.status(Response.Status.CREATED).entity(response).build();
    }

    @PUT
    @Path("/{id}")
    @Operation(summary = "Met à jour une proposition d'aide")
    public PropositionAideResponse mettreAJour(@PathParam("id") String id,
            @Valid UpdatePropositionAideRequest request) {
        return propositionAideService.mettreAJour(id, request);
    }

    @GET
    @Path("/meilleures")
    @Operation(summary = "Récupère les meilleures propositions")
    public List<PropositionAideResponse> obtenirMeilleures(@QueryParam("limite") @DefaultValue("5") int limite) {
        return propositionAideService.obtenirMeilleuresPropositions(limite);
    }
}
