package dev.lions.unionflow.server.resource.mutuelle;

import dev.lions.unionflow.server.api.dto.mutuelle.financier.ParametresFinanciersMutuellRequest;
import dev.lions.unionflow.server.api.dto.mutuelle.financier.ParametresFinanciersMutuellResponse;
import dev.lions.unionflow.server.security.RequiresModule;
import dev.lions.unionflow.server.service.mutuelle.InteretsEpargneService;
import dev.lions.unionflow.server.service.mutuelle.ParametresFinanciersService;
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 java.util.Map;
import java.util.UUID;

@Path("/api/v1/mutuelle/parametres-financiers")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RequiresModule("EPARGNE")
public class ParametresFinanciersResource {

    @Inject ParametresFinanciersService parametresService;
    @Inject InteretsEpargneService interetsService;

    @GET
    @Path("/{orgId}")
    @RolesAllowed({"ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION", "MUTUELLE_RESP"})
    public Response getByOrganisation(@PathParam("orgId") UUID orgId) {
        return Response.ok(parametresService.getByOrganisation(orgId)).build();
    }

    @POST
    @RolesAllowed({"ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION"})
    public Response creerOuMettrAJour(@Valid ParametresFinanciersMutuellRequest request) {
        ParametresFinanciersMutuellResponse resp = parametresService.creerOuMettrAJour(request);
        return Response.ok(resp).build();
    }

    /**
     * Déclenche manuellement le calcul des intérêts / dividendes pour une organisation.
     * Utile pour régularisation ou test.
     */
    @POST
    @Path("/{orgId}/calculer-interets")
    @RolesAllowed({"ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION"})
    public Response calculerInterets(@PathParam("orgId") UUID orgId) {
        Map<String, Object> result = interetsService.calculerManuellement(orgId);
        return Response.ok(result).build();
    }
}
