package com.airlock.iam.common.application.configuration.gateway;

import com.airlock.iam.common.application.configuration.gateway.extractor.ClientIpExtractorConfig;
import com.airlock.iam.common.application.configuration.gateway.extractor.RequestIdExtractorConfig;
import com.airlock.iam.common.application.configuration.gateway.extractor.RequestMtlsClientCertificateExtractorConfig;
import com.airlock.iam.common.application.configuration.gateway.extractor.RequestUrlExtractorConfig;
import com.airlock.iam.core.application.configuration.waf.GatewayConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(
   description = "Configuration for Airlock Microgateway running in front of Airlock IAM. While active, IAM parses HTTP\nrequest headers.",
   displayName = "Airlock Microgateway Settings"
)
public final class AirlockMicrogatewayConfig implements GatewayLoginappConfig, GatewayConfig {
   public static final String AIRLOCK_MICROGATEWAY_SETTINGS_DISPLAY_NAME = "Airlock Microgateway Settings";
   public static final String MICROGATEWAY_CONFIG_PROPERTY_DESRIPTION = "Settings regarding an Airlock Microgateway placed in front of Airlock IAM. If no settings are configured, extra\ninformation from the Airlock Microgateway will not be available and it may be harder to correlate log messages\nthat are written to different log files.";
   @PluginProperty(
      displayName = "HTTP Request Client IP Extractor",
      description = "Extracts the client IP address from the incoming HTTP request. The request ID is written by the gateway in\nfront and is required by IAM in various places, e.g. when writing log files.",
      optional = true,
      defaultValue = ClientIpExtractorConfig.class
   )
   private ClientIpExtractorConfig clientIpExtractor;
   @PluginProperty(
      displayName = "HTTP Request ID Extractor",
      description = "Extracts the ID from the incoming HTTP request. The request ID is required by IAM in various\nplaces, e.g. when writing log files.",
      optional = true,
      defaultValue = RequestIdExtractorConfig.class
   )
   private RequestIdExtractorConfig requestIdExtractor;
   @PluginProperty(
      displayName = "HTTP Request URL Extractor",
      description = "Extracts the request URL as seen by the client from the incoming HTTP request. The request URL is required by IAM in various\nplaces, e.g. when using OAuth 2.0.",
      optional = true,
      defaultValue = RequestUrlExtractorConfig.class
   )
   private RequestUrlExtractorConfig requestUrlExtractor;
   @PluginProperty(
      displayName = "HTTP Request Client mTLS Certificate Extractor",
      description = "Extracts the mutual TLS client certificate from the incoming HTTP request. The client certificate is\nrequired by IAM in various places, e.g. when using OAuth 2.0.",
      optional = true,
      defaultValue = RequestMtlsClientCertificateExtractorConfig.class
   )
   private RequestMtlsClientCertificateExtractorConfig requestMtlsClientCertExtractor;

   public ClientIpExtractorConfig getClientIpExtractor() {
      return this.clientIpExtractor;
   }

   public RequestIdExtractorConfig getRequestIdExtractor() {
      return this.requestIdExtractor;
   }

   public RequestUrlExtractorConfig getRequestUrlExtractor() {
      return this.requestUrlExtractor;
   }

   public RequestMtlsClientCertificateExtractorConfig getRequestMtlsClientCertificateExtractor() {
      return this.requestMtlsClientCertExtractor;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static AirlockMicrogatewayConfig.AirlockMicrogatewayConfigBuilder builder() {
      return new AirlockMicrogatewayConfig.AirlockMicrogatewayConfigBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public AirlockMicrogatewayConfig() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public AirlockMicrogatewayConfig(
      ClientIpExtractorConfig clientIpExtractor,
      RequestIdExtractorConfig requestIdExtractor,
      RequestUrlExtractorConfig requestUrlExtractor,
      RequestMtlsClientCertificateExtractorConfig requestMtlsClientCertExtractor
   ) {
      this.clientIpExtractor = clientIpExtractor;
      this.requestIdExtractor = requestIdExtractor;
      this.requestUrlExtractor = requestUrlExtractor;
      this.requestMtlsClientCertExtractor = requestMtlsClientCertExtractor;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class AirlockMicrogatewayConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private ClientIpExtractorConfig clientIpExtractor;
      @SuppressFBWarnings(justification = "generated code")
      private RequestIdExtractorConfig requestIdExtractor;
      @SuppressFBWarnings(justification = "generated code")
      private RequestUrlExtractorConfig requestUrlExtractor;
      @SuppressFBWarnings(justification = "generated code")
      private RequestMtlsClientCertificateExtractorConfig requestMtlsClientCertExtractor;

      @SuppressFBWarnings(justification = "generated code")
      AirlockMicrogatewayConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public AirlockMicrogatewayConfig.AirlockMicrogatewayConfigBuilder clientIpExtractor(ClientIpExtractorConfig clientIpExtractor) {
         this.clientIpExtractor = clientIpExtractor;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AirlockMicrogatewayConfig.AirlockMicrogatewayConfigBuilder requestIdExtractor(RequestIdExtractorConfig requestIdExtractor) {
         this.requestIdExtractor = requestIdExtractor;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AirlockMicrogatewayConfig.AirlockMicrogatewayConfigBuilder requestUrlExtractor(RequestUrlExtractorConfig requestUrlExtractor) {
         this.requestUrlExtractor = requestUrlExtractor;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AirlockMicrogatewayConfig.AirlockMicrogatewayConfigBuilder requestMtlsClientCertExtractor(
         RequestMtlsClientCertificateExtractorConfig requestMtlsClientCertExtractor
      ) {
         this.requestMtlsClientCertExtractor = requestMtlsClientCertExtractor;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AirlockMicrogatewayConfig build() {
         return new AirlockMicrogatewayConfig(this.clientIpExtractor, this.requestIdExtractor, this.requestUrlExtractor, this.requestMtlsClientCertExtractor);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "AirlockMicrogatewayConfig.AirlockMicrogatewayConfigBuilder(clientIpExtractor="
            + this.clientIpExtractor
            + ", requestIdExtractor="
            + this.requestIdExtractor
            + ", requestUrlExtractor="
            + this.requestUrlExtractor
            + ", requestMtlsClientCertExtractor="
            + this.requestMtlsClientCertExtractor
            + ")";
      }
   }
}
