package com.lions.dev.resource; import com.lions.dev.dto.request.establishment.InitiateSubscriptionRequestDTO; import com.lions.dev.dto.response.establishment.InitiateSubscriptionResponseDTO; import com.lions.dev.service.WavePaymentService; 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 org.jboss.logging.Logger; import java.util.Map; import java.util.UUID; /** * Ressource pour les abonnements / droits d'accès des établissements (paiement Wave). */ @Path("/establishments/{establishmentId}/subscriptions") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Tag(name = "Establishment Subscriptions", description = "Paiement des droits d'accès via Wave") public class EstablishmentSubscriptionResource { private static final Logger LOG = Logger.getLogger(EstablishmentSubscriptionResource.class); @Inject WavePaymentService wavePaymentService; /** * Initie un paiement Wave pour les droits d'accès d'un établissement. * Retourne l'URL de redirection vers la page de paiement Wave. */ @POST @Path("/initiate") @Operation(summary = "Initier un paiement Wave (droits d'accès)", description = "Crée une session Wave et retourne l'URL de paiement. Le client redirige l'utilisateur vers payment_url.") public Response initiatePayment( @PathParam("establishmentId") UUID establishmentId, @Valid InitiateSubscriptionRequestDTO request) { try { InitiateSubscriptionResponseDTO response = wavePaymentService.initiatePayment( establishmentId, request.getPlan(), request.getClientPhone() ); return Response.ok(response).build(); } catch (IllegalArgumentException e) { LOG.warn(e.getMessage()); return Response.status(Response.Status.NOT_FOUND).entity("{\"message\": \"" + e.getMessage() + "\"}").build(); } } /** * Vérifie si l'établissement a un abonnement actif. */ @GET @Path("/status") @Operation(summary = "Statut d'abonnement", description = "Indique si l'établissement a des droits d'accès actifs.") public Response getSubscriptionStatus(@PathParam("establishmentId") UUID establishmentId) { boolean active = wavePaymentService.hasActiveSubscription(establishmentId); return Response.ok(Map.of("hasActiveSubscription", active)).build(); } }