package fr.titionfire.ffsaf.rest;

import fr.titionfire.ffsaf.domain.service.TradService;
import fr.titionfire.ffsaf.rest.client.SirenService;
import fr.titionfire.ffsaf.rest.client.StateIdService;
import fr.titionfire.ffsaf.rest.data.AssoData;
import fr.titionfire.ffsaf.rest.exception.DNotFoundException;
import io.smallrye.mutiny.Uni;
import jakarta.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import org.eclipse.microprofile.openapi.annotations.Operation;
import org.eclipse.microprofile.rest.client.inject.RestClient;

@Path("api/asso")
public class AssoEndpoints {

    @RestClient
    StateIdService stateIdService;

    @RestClient
    SirenService sirenService;

    @Inject
    TradService trad;

    @GET
    @Path("state_id/{stateId}")
    @Produces(MediaType.APPLICATION_JSON)
    @Operation(hidden = true)
    public Uni<AssoData> getAssoInfo(@PathParam("stateId") String stateId) {
        return ((stateId.charAt(0) == 'W') ? stateIdService.get_rna(stateId) : sirenService.get_unite(
                stateId).chain(stateIdService::getAssoDataFromUnit)).onFailure().transform(throwable -> {
            if (throwable instanceof WebApplicationException exception) {
                if (exception.getResponse().getStatus() == 404)
                    return new DNotFoundException(trad.t("service.momentanement.indisponible"));
                if (exception.getResponse().getStatus() == 400)
                    return new DNotFoundException(trad.t("asso.introuvable"));
            }
            return throwable;
        });
    }
}
