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

import com.airlock.iam.common.api.application.configuration.location.transform.StringTransformerConfig;
import com.airlock.iam.common.application.configuration.credential.SsoTicketExtractorConfig;
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 com.airlock.iam.plugin.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(description = "Extracts an SSO ticket from a specified HTTP cookie contained in the request.", displayName = "SSO Cookie Ticket Extractor")
@PluginLicenseRestriction(moduleAffiliation = "SSOTickets")
public class SsoCookieTicketExtractorConfig implements SsoTicketExtractorConfig {
   @StringProperty(description = "The name of the cookie containing the value to be extracted.", optional = false, exampleValues = "LOGIN-TOKEN")
   private String cookieName;
   @BooleanProperty(
      displayName = "URL-Decode Cookie 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;
   @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;

   public String getCookieName() {
      return this.cookieName;
   }

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

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

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

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

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

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

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

      @SuppressFBWarnings(justification = "generated code")
      public SsoCookieTicketExtractorConfig.SsoCookieTicketExtractorConfigBuilder cookieName(String cookieName) {
         this.cookieName = cookieName;
         return this;
      }

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

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

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

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