package com.airlock.iam.factor.application.configuration.airlock2fa;

import com.airlock.iam.core.application.configuration.contextdata.StringContextDataItemNameConfig;
import com.airlock.iam.factor.domain.service.airlock2fa.displayname.Airlock2FAAccountDisplayNameProvider;
import com.airlock.iam.factor.domain.service.airlock2fa.displayname.Airlock2FAContextDataDisplayNameProvider;
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.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(
   description = "Provides the value of a configured context data during the user's enrollment for Airlock 2FA as display name.",
   displayName = "Context Data Item (Airlock 2FA Account Display Name)"
)
@PluginLicenseRestriction(moduleAffiliation = "Airlock2FA")
public final class Airlock2FAContextDataDisplayNameProviderConfig implements Airlock2FAUserAccountDisplayNameProviderConfig {
   @PluginProperty(description = "Name of the context data whose value is to be used as display name during user's enrollment.", optional = false)
   private StringContextDataItemNameConfig contextDataName;
   @BooleanProperty(
      description = "If enabled, it is mandatory that the context data field be non-blank, otherwise attempting to create an Airlock 2FA account will result in an error. If disabled and the context data field is blank, then no display name will be provided.",
      optional = true,
      defaultValue = "false"
   )
   private boolean mandatory;

   @Override
   public Airlock2FAAccountDisplayNameProvider logic() {
      return Airlock2FAContextDataDisplayNameProvider.builder()
         .contextDataName(this.contextDataName.getContextDataName())
         .contextDataValueMandatory(this.mandatory)
         .build();
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public Airlock2FAContextDataDisplayNameProviderConfig(StringContextDataItemNameConfig contextDataName, boolean mandatory) {
      this.contextDataName = contextDataName;
      this.mandatory = mandatory;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class Airlock2FAContextDataDisplayNameProviderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private StringContextDataItemNameConfig contextDataName;
      @SuppressFBWarnings(justification = "generated code")
      private boolean mandatory;

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

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FAContextDataDisplayNameProviderConfig.Airlock2FAContextDataDisplayNameProviderConfigBuilder contextDataName(
         StringContextDataItemNameConfig contextDataName
      ) {
         this.contextDataName = contextDataName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FAContextDataDisplayNameProviderConfig.Airlock2FAContextDataDisplayNameProviderConfigBuilder mandatory(boolean mandatory) {
         this.mandatory = mandatory;
         return this;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Airlock2FAContextDataDisplayNameProviderConfig.Airlock2FAContextDataDisplayNameProviderConfigBuilder(contextDataName="
            + this.contextDataName
            + ", mandatory="
            + this.mandatory
            + ")";
      }
   }
}
