package com.airlock.iam.common.infrastructure.exception;

import com.airlock.iam.base.api.infrastructure.uri.ExternalUriInfo;
import com.google.inject.ProvisionException;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.ext.ExceptionMapper;
import java.util.Optional;
import org.glassfish.jersey.spi.ExceptionMappers;

@jakarta.ws.rs.ext.Provider
public class ProvisionExceptionMapper extends BaseExceptionMapper<ProvisionException> {
   private final Provider<ExceptionMappers> exceptionMappers;

   @Inject
   public ProvisionExceptionMapper(Provider<ExceptionMappers> exceptionMappers, Provider<ExternalUriInfo> uriInfo) {
      super(Status.NOT_IMPLEMENTED, uriInfo);
      this.exceptionMappers = exceptionMappers;
   }

   public Response toResponse(ProvisionException exception) {
      Throwable cause = exception.getCause();
      return this.findExceptionMapper(cause).map(causeExceptionMapper -> causeExceptionMapper.toResponse(cause)).orElseGet(() -> super.toResponse(exception));
   }

   private Optional<ExceptionMapper<Throwable>> findExceptionMapper(Throwable throwable) {
      return Optional.ofNullable(((ExceptionMappers)this.exceptionMappers.get()).findMapping(throwable));
   }
}
