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

import com.airlock.iam.common.api.application.configuration.location.transform.StringTransformerConfig;
import com.airlock.iam.common.application.configuration.sso.SsoHeaderTicketExtractorConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.license.PluginLicenseRestriction;
import com.airlock.iam.plugin.api.annotation.property.BooleanProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginListProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(
   description = "Extracts an SSO ticket from the Loginapp UI contained in the request headers. The header is expected to be named \"X-IAM-SSO-Ticket\".",
   displayName = "Loginapp UI SSO Ticket Extractor"
)
@PluginLicenseRestriction(moduleAffiliation = "SSOTickets")
public class LoginappUiSsoTicketExtractorConfig implements SsoHeaderTicketExtractorConfig {
   public static final String X_IAM_SSO_TICKET_HEADER_NAME = "X-IAM-SSO-Ticket";
   @PluginListProperty(
      description = "The chain of string transformers that transform the extracted string value to the final extraction result.",
      optional = true,
      minElements = 1
   )
   private List<StringTransformerConfig> stringTransformers;
   @BooleanProperty(
      displayName = "URL-Decode Header Value",
      description = "If enabled, URL-decodes the extracted value using character set UTF8.<p>URL-decoding is applied before the 'String Transformers' run.</p>",
      optional = true,
      defaultValue = "true"
   )
   private boolean urlDecodeValue;

   @Override
   public boolean urlDecodeValue() {
      return this.urlDecodeValue;
   }

   public List<StringTransformerConfig> getStringTransformers() {
      return this.stringTransformers;
   }

   public boolean isUrlDecodeValue() {
      return this.urlDecodeValue;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public LoginappUiSsoTicketExtractorConfig(List<StringTransformerConfig> stringTransformers, boolean urlDecodeValue) {
      this.stringTransformers = stringTransformers;
      this.urlDecodeValue = urlDecodeValue;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class LoginappUiSsoTicketExtractorConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private List<StringTransformerConfig> stringTransformers;
      @SuppressFBWarnings(justification = "generated code")
      private boolean urlDecodeValue;

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

      @SuppressFBWarnings(justification = "generated code")
      public LoginappUiSsoTicketExtractorConfig.LoginappUiSsoTicketExtractorConfigBuilder stringTransformers(List<StringTransformerConfig> stringTransformers) {
         this.stringTransformers = stringTransformers;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LoginappUiSsoTicketExtractorConfig.LoginappUiSsoTicketExtractorConfigBuilder urlDecodeValue(boolean urlDecodeValue) {
         this.urlDecodeValue = urlDecodeValue;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LoginappUiSsoTicketExtractorConfig build() {
         return new LoginappUiSsoTicketExtractorConfig(this.stringTransformers, this.urlDecodeValue);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "LoginappUiSsoTicketExtractorConfig.LoginappUiSsoTicketExtractorConfigBuilder(stringTransformers="
            + this.stringTransformers
            + ", urlDecodeValue="
            + this.urlDecodeValue
            + ")";
      }
   }
}
