package com.airlock.iam.oauth2.application.configuration.accountregistration;

import com.airlock.iam.oauth2.domain.model.accountregistration.AccountRegistrationContextDataExtractor;
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.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "Context data to include in the created IAM user.", displayName = "Context Data Item")
@PluginLicenseRestriction(moduleAffiliation = "OAuthSocialRegistration")
public final class ContextDataItemConfig {
   @StringProperty(
      description = "The name of the context data item of the provider account.<p>To be able obtain the context data value, it is required to add an 'OAuth 2.0 Remote Context Data Resource' with a 'Local Context Data Key' equal to this value to the resource mappings.</p>",
      exampleValues = {"surname", "givenname", "email"},
      optional = false
   )
   private String contextDataItemName;
   @BooleanProperty(
      description = "Defines whether the context data value has to be present or not. If a mandatory property is missing, the user will not be created.",
      defaultValue = "false",
      optional = true
   )
   private boolean optional;

   public AccountRegistrationContextDataExtractor logic() {
      return new AccountRegistrationContextDataExtractor(this.contextDataItemName, this.optional);
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public ContextDataItemConfig(String contextDataItemName, boolean optional) {
      this.contextDataItemName = contextDataItemName;
      this.optional = optional;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class ContextDataItemConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String contextDataItemName;
      @SuppressFBWarnings(justification = "generated code")
      private boolean optional;

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

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataItemConfig.ContextDataItemConfigBuilder contextDataItemName(String contextDataItemName) {
         this.contextDataItemName = contextDataItemName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataItemConfig.ContextDataItemConfigBuilder optional(boolean optional) {
         this.optional = optional;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataItemConfig build() {
         return new ContextDataItemConfig(this.contextDataItemName, this.optional);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ContextDataItemConfig.ContextDataItemConfigBuilder(contextDataItemName=" + this.contextDataItemName + ", optional=" + this.optional + ")";
      }
   }
}
