package com.airlock.iam.flow.shared.application.configuration.valueprovider;

import com.airlock.iam.flow.api.application.configuration.selection.FlowConditionConfig;
import com.airlock.iam.flow.api.application.configuration.valueprovider.ValueMapProviderConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(
   description = "Optionally relays the values of another Value Map Provider, depending on the evaluation of a flow condition.",
   displayName = "Conditional Value Map Provider"
)
public class ConditionalValueMapProviderConfig implements ValueMapProviderConfig {
   public static final String DISPLAY_NAME = "Conditional Value Map Provider";
   @PluginProperty(
      description = "A condition that must be met for this Value Map Provider to relay the values of the embedded Value Map Provider.",
      optional = false
   )
   private FlowConditionConfig condition;
   @PluginProperty(
      description = "A Value Map Provider whose provided values will be relayed by this Value Map Provider only if the condition is met.\n",
      optional = false
   )
   private ValueMapProviderConfig valueMapProvider;

   public FlowConditionConfig getCondition() {
      return this.condition;
   }

   public ValueMapProviderConfig getValueMapProvider() {
      return this.valueMapProvider;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public ConditionalValueMapProviderConfig(FlowConditionConfig condition, ValueMapProviderConfig valueMapProvider) {
      this.condition = condition;
      this.valueMapProvider = valueMapProvider;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class ConditionalValueMapProviderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private FlowConditionConfig condition;
      @SuppressFBWarnings(justification = "generated code")
      private ValueMapProviderConfig valueMapProvider;

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

      @SuppressFBWarnings(justification = "generated code")
      public ConditionalValueMapProviderConfig.ConditionalValueMapProviderConfigBuilder condition(FlowConditionConfig condition) {
         this.condition = condition;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ConditionalValueMapProviderConfig.ConditionalValueMapProviderConfigBuilder valueMapProvider(ValueMapProviderConfig valueMapProvider) {
         this.valueMapProvider = valueMapProvider;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ConditionalValueMapProviderConfig build() {
         return new ConditionalValueMapProviderConfig(this.condition, this.valueMapProvider);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ConditionalValueMapProviderConfig.ConditionalValueMapProviderConfigBuilder(condition="
            + this.condition
            + ", valueMapProvider="
            + this.valueMapProvider
            + ")";
      }
   }
}
