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

import ch.ergon.restal.jsonapi.document.error.ErrorData;
import com.airlock.iam.base.api.infrastructure.uri.ExternalUriInfo;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.exception.RadiusServerUnavailableException;
import com.airlock.iam.common.infrastructure.exception.BaseExceptionMapper;
import com.airlock.iam.common.infrastructure.exception.IamRestErrorCode;
import com.airlock.iam.elog.api.LogTypes;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.core.Response.Status;

@jakarta.ws.rs.ext.Provider
public final class RadiusServerUnavailableExceptionMapper extends BaseExceptionMapper<RadiusServerUnavailableException> {
   @Inject
   public RadiusServerUnavailableExceptionMapper(Provider<ExternalUriInfo> uriInfo) {
      super(Status.INTERNAL_SERVER_ERROR, IamRestErrorCode.EXTERNAL_SERVICE_UNAVAILABLE, uriInfo);
   }

   protected void logException(RadiusServerUnavailableException exception, ErrorData data) {
      LOG.fatal(
         LogTypes.RADIUS_SERVER_ACCESS,
         String.format("Exception from calling a RADIUS server at %s: %s", exception.getLogSafeUri(), LogUtil.logSafeString(exception.getMessage()))
      );
      if (LOG.isDebugEnabled() && !this.shouldLogStacktraceAsError(exception)) {
         LOG.debug(data.toString(), exception);
      }
   }
}
