package com.airlock.iam.authentication.application.configuration.idpropagation;

import com.airlock.iam.authentication.api.application.configuration.idpropagation.ResponseAdderConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.StringListProperty;
import com.airlock.iam.plugin.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(
   description = "Instructs Airlock Gateway (WAF) to add a request header to backend requests. This requires that an Airlock Gateway is used and configured in IAM."
)
public final class RequestHeaderTicketAdderConfig implements ResponseAdderConfig {
   @StringProperty(description = "The name of the header.", exampleValues = "X-AUTH-TICKET", optional = false)
   private String headerName;
   @StringProperty(description = "Header content prefix.", exampleValues = "Bearer", optional = true)
   private String contentPrefix;
   @StringListProperty(
      description = "This property optionally defines the name of the Airlock Gateway (WAF) mappings on which the header is used. If no mapping name is specified, the HTTP header is used on all Airlock Gateway mappings.",
      exampleElements = {"mapping1", "m1", "authappl"},
      optional = true
   )
   private List<String> mappingNames;

   public String getHeaderName() {
      return this.headerName;
   }

   public String getContentPrefix() {
      return this.contentPrefix;
   }

   public List<String> getMappingNames() {
      return this.mappingNames;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public RequestHeaderTicketAdderConfig(String headerName, String contentPrefix, List<String> mappingNames) {
      this.headerName = headerName;
      this.contentPrefix = contentPrefix;
      this.mappingNames = mappingNames;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class RequestHeaderTicketAdderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String headerName;
      @SuppressFBWarnings(justification = "generated code")
      private String contentPrefix;
      @SuppressFBWarnings(justification = "generated code")
      private List<String> mappingNames;

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

      @SuppressFBWarnings(justification = "generated code")
      public RequestHeaderTicketAdderConfig.RequestHeaderTicketAdderConfigBuilder headerName(String headerName) {
         this.headerName = headerName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RequestHeaderTicketAdderConfig.RequestHeaderTicketAdderConfigBuilder contentPrefix(String contentPrefix) {
         this.contentPrefix = contentPrefix;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RequestHeaderTicketAdderConfig.RequestHeaderTicketAdderConfigBuilder mappingNames(List<String> mappingNames) {
         this.mappingNames = mappingNames;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RequestHeaderTicketAdderConfig build() {
         return new RequestHeaderTicketAdderConfig(this.headerName, this.contentPrefix, this.mappingNames);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "RequestHeaderTicketAdderConfig.RequestHeaderTicketAdderConfigBuilder(headerName="
            + this.headerName
            + ", contentPrefix="
            + this.contentPrefix
            + ", mappingNames="
            + this.mappingNames
            + ")";
      }
   }
}
