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

import com.airlock.iam.base.api.infrastructure.uri.ExternalUriInfo;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.core.misc.util.ExceptionUtils;
import com.airlock.iam.elog.api.EDefaultLogType;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.saml2.domain.model.Saml2ErrorUri;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.ClientErrorException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.ext.ExceptionMapper;
import java.util.Optional;

@jakarta.ws.rs.ext.Provider
public class ClientErrorExceptionMapper implements ExceptionMapper<ClientErrorException> {
   private static final ELogger LOG = ELoggerFactory.getLogger(ClientErrorExceptionMapper.class);
   private final Provider<Saml2ErrorUri> errorUri;
   private final Provider<ExternalUriInfo> uriInfo;

   @Inject
   public ClientErrorExceptionMapper(Provider<Saml2ErrorUri> errorUri, Provider<ExternalUriInfo> uriInfo) {
      this.errorUri = errorUri;
      this.uriInfo = uriInfo;
   }

   public Response toResponse(ClientErrorException exception) {
      LOG.info(
         EDefaultLogType.GENERIC_LOG_TYPE,
         "Client side problem in request to "
            + LogUtil.logSafeQuote(((ExternalUriInfo)this.uriInfo.get()).getAbsolutePath())
            + this.getDetails(exception)
            + ". Redirecting to error page."
      );
      return Response.status(Status.FOUND).header("Location", ((Saml2ErrorUri)this.errorUri.get()).getUri()).build();
   }

   private String getDetails(ClientErrorException exception) {
      return Optional.ofNullable(ExceptionUtils.extractCause(exception)).map(message -> ": " + message).orElse("");
   }
}
