package com.airlock.iam.flow.application.configuration.selection.condition;

import com.airlock.iam.flow.api.application.configuration.selection.FlowConditionConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginListProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

@Plugin(
   description = "Flow condition that performs a logical \"AND\" operation on a set of configurable conditions. The condition is fulfilled if and only if all of the configured conditions are fulfilled.",
   displayName = "Logical AND"
)
public class LogicalAndFlowConditionConfig implements FlowConditionConfig {
   @PluginListProperty(description = "Conditions to whose results the \"AND\" operation will be applied.", optional = false, minElements = 2)
   private List<FlowConditionConfig> conditions;

   public LogicalAndFlowConditionConfig(List<FlowConditionConfig> conditions) {
      this.conditions = conditions;
   }

   public List<FlowConditionConfig> getConditions() {
      return this.conditions;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public static class LogicalAndFlowConditionConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private ArrayList<FlowConditionConfig> conditions;

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

      @SuppressFBWarnings(justification = "generated code")
      public LogicalAndFlowConditionConfig.LogicalAndFlowConditionConfigBuilder condition(FlowConditionConfig condition) {
         if (this.conditions == null) {
            this.conditions = new ArrayList<>();
         }

         this.conditions.add(condition);
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LogicalAndFlowConditionConfig.LogicalAndFlowConditionConfigBuilder conditions(Collection<? extends FlowConditionConfig> conditions) {
         if (conditions == null) {
            throw new NullPointerException("conditions cannot be null");
         }

         if (this.conditions == null) {
            this.conditions = new ArrayList<>();
         }

         this.conditions.addAll(conditions);
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LogicalAndFlowConditionConfig.LogicalAndFlowConditionConfigBuilder clearConditions() {
         if (this.conditions != null) {
            this.conditions.clear();
         }

         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LogicalAndFlowConditionConfig build() {
         return new LogicalAndFlowConditionConfig(switch (this.conditions == null ? 0 : this.conditions.size()) {
            case 0 -> Collections.emptyList();
            case 1 -> Collections.singletonList(this.conditions.get(0));
            default -> Collections.unmodifiableList(new ArrayList<>(this.conditions));
         });
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "LogicalAndFlowConditionConfig.LogicalAndFlowConditionConfigBuilder(conditions=" + this.conditions + ")";
      }
   }
}
