package com.airlock.iam.saml2.application.configuration.assertion.attribute;

import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
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.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "A SAML 2.0 attribute containing context data of the user.", displayName = "Context Data SAML 2.0 Attribute")
@PluginLicenseRestriction(moduleAffiliation = "SamlIdp")
public class ContextDataAttributeConfig extends SamlIdpAttributeConfigWithNameFormat implements SamlFlowIdpAttributeConfig {
   private static final ELogger LOG = ELoggerFactory.getLogger(ContextDataAttributeConfig.class);
   @StringProperty(
      displayName = "Attribute Name",
      description = "The name of the attribute to add to the assertion.",
      exampleValues = {"givenname", "authmethod"},
      optional = false
   )
   private String samlAttributeName;
   @StringProperty(
      displayName = "Context Data Name",
      description = "The context data key to add to the Assertion. If the context data doesn't contain any value for the given key, the attribute will not be included in the assertion.",
      exampleValues = {"givenname", "auth_method"},
      optional = false
   )
   private String contextDataName;

   public ContextDataAttributeConfig(String samlAttributeName, String contextDataName, String nameFormat) {
      super(nameFormat);
      this.samlAttributeName = samlAttributeName;
      this.contextDataName = contextDataName;
   }

   @Override
   public String getSamlAttributeName() {
      return this.samlAttributeName;
   }

   public String getContextDataName() {
      return this.contextDataName;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public static class ContextDataAttributeConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String samlAttributeName;
      @SuppressFBWarnings(justification = "generated code")
      private String contextDataName;
      @SuppressFBWarnings(justification = "generated code")
      private String nameFormat;

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

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataAttributeConfig.ContextDataAttributeConfigBuilder samlAttributeName(String samlAttributeName) {
         this.samlAttributeName = samlAttributeName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataAttributeConfig.ContextDataAttributeConfigBuilder contextDataName(String contextDataName) {
         this.contextDataName = contextDataName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataAttributeConfig.ContextDataAttributeConfigBuilder nameFormat(String nameFormat) {
         this.nameFormat = nameFormat;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataAttributeConfig build() {
         return new ContextDataAttributeConfig(this.samlAttributeName, this.contextDataName, this.nameFormat);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ContextDataAttributeConfig.ContextDataAttributeConfigBuilder(samlAttributeName="
            + this.samlAttributeName
            + ", contextDataName="
            + this.contextDataName
            + ", nameFormat="
            + this.nameFormat
            + ")";
      }
   }
}
