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

import com.airlock.iam.base.api.infrastructure.uri.ExternalUriInfo;
import com.google.inject.CreationException;
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 CreationExceptionMapper extends BaseExceptionMapper<CreationException> {
   private final Provider<ExceptionMappers> exceptionMappers;

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

   public Response toResponse(CreationException exception) {
      Throwable cause = exception.getCause();
      return this.getExceptionMapper(cause).map(mapper -> mapper.toResponse(cause)).orElseGet(() -> super.toResponse(exception));
   }

   protected boolean shouldLogStacktraceAsError(CreationException exception) {
      return this.getExceptionMapper(exception.getCause()).isEmpty();
   }

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