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

import com.airlock.iam.base.api.infrastructure.uri.ExternalUriInfo;
import com.airlock.iam.base.infrastructure.error.ErrorResponse;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.infrastructure.logger.LogTypes;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.fasterxml.jackson.core.JsonProcessingException;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import org.apache.commons.lang3.Strings;

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

   @Inject
   public JacksonExceptionMapper(Provider<ExternalUriInfo> uriInfo) {
      this.uriInfo = uriInfo;
   }

   public Response toResponse(JsonProcessingException exception) {
      String requestPath = LogUtil.logSafeQuote(Strings.CS.prependIfMissing(((ExternalUriInfo)this.uriInfo.get()).getPath(), "/", new CharSequence[0]));
      LOG.info(LogTypes.REST_EXCEPTION_HANDLER, "Invalid request format during call to " + requestPath + ": " + exception.getMessage());
      return ErrorResponse.badRequest().errorCode(IamRestErrorCode.INVALID_REQUEST_FORMAT).build().toResponse();
   }
}
