package com.airlock.iam.common.infrastructure;

import com.airlock.iam.common.application.UserParamConverterProvider;
import com.airlock.iam.common.application.identity.IdentityParamConverterProvider;
import com.airlock.iam.core.infrastructure.scanner.ApplicationComponentClasspathScanner;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.elog.api.LogTypes;
import com.google.common.base.Stopwatch;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.ws.rs.core.Configurable;
import java.util.concurrent.TimeUnit;
import org.glassfish.jersey.server.ResourceConfig;

public abstract class IamRestApplication extends ResourceConfig {
   public static final ELogger LOGGER = ELoggerFactory.getLogger(IamRestApplication.class);

   @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", justification = "\"configure()\" is an API extension point")
   public IamRestApplication(RestApplicationDefinition restConfigProvider) {
      Stopwatch stopwatch = Stopwatch.createStarted();
      LOGGER.info(LogTypes.SERVER_INFO_SYS, String.format("Initializing REST application \"%s\"...", restConfigProvider.applicationName()));
      this.property("jersey.config.server.response.setStatusOverSendError", true);
      this.property("jersey.config.server.wadl.disableWadl", true);
      RestApplicationConfig restConfig = restConfigProvider.getRestConfig();
      new RestConfigurator(this, restConfig).configure();
      this.register(UserParamConverterProvider.class);
      this.register(IdentityParamConverterProvider.class);
      this.configure(this);
      LOGGER.info(
         LogTypes.SERVER_INFO_SYS,
         String.format("REST application \"%s\" initialized (took %s ms)", restConfigProvider.applicationName(), stopwatch.elapsed(TimeUnit.MILLISECONDS))
      );
      ApplicationComponentClasspathScanner.clearScanResultIfAllJerseyAppsInitialized();
   }

   public void configure(Configurable<?> configurableApplication) {
   }
}
