package com.airlock.iam.application.webserver.infrastructure.deploy;

import com.airlock.iam.application.parameters.domain.model.ParameterVariableSpec;
import com.airlock.iam.application.parameters.domain.model.WebAppParameters;
import com.airlock.iam.application.resources.infrastructure.ResourceLocator;
import java.net.URI;
import java.nio.file.Path;
import java.util.List;
import org.apache.catalina.Context;
import org.apache.catalina.startup.Tomcat;

public final class IamWebAppModuleDeployer implements Deployer {
   private final WebAppParameters parameters;
   private final ResourceLocator resourceLocator;

   public IamWebAppModuleDeployer(WebAppParameters parameters, ResourceLocator resourceLocator) {
      this.resourceLocator = resourceLocator;
      this.parameters = parameters;
   }

   @Override
   public Context deploy(Tomcat tomcat) {
      Path docBase = this.resourceLocator.getDocBase(this.parameters.module());
      Context context = tomcat.addWebapp(this.parameters.urlPath(), docBase.toString());
      ContextConfigurator.setJarScanner(context);
      ContextConfigurator.addToWebappClasspath(context, this.parameters.classpath());
      ContextConfigurator.addToWebappClasspath(context, this.parameters.classpathExtension());
      this.parameters.applicationListener().ifPresent(context::addApplicationListener);
      Log4jConfigResources builtIn = new Log4jConfigResources(this.resourceLocator);
      List<URI> log4jConfigs = this.parameters
         .log4jConfigs()
         .stream()
         .map(config -> config.getPath().orElseGet(() -> builtIn.resolveConfig((ParameterVariableSpec)config.getVariable().orElseThrow())))
         .map(Path::toUri)
         .toList();
      if (this.parameters.isSpringApplication()) {
         ContextConfigurator.setSpringLog4jConfiguration(context, log4jConfigs);
      } else {
         ContextConfigurator.setLog4jConfiguration(context, log4jConfigs);
      }

      return context;
   }
}
