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

import com.airlock.iam.flow.api.application.configuration.redflag.RedFlagConfig;
import com.airlock.iam.flow.api.application.configuration.selection.FlowConditionConfig;
import com.airlock.iam.flow.api.application.configuration.step.AbstractFlowStepConfig;
import com.airlock.iam.flow.api.application.configuration.step.NonInteractiveStepConfig;
import com.airlock.iam.flow.api.application.configuration.step.StepIdConfig;
import com.airlock.iam.flow.api.application.configuration.tag.TagConfig;
import com.airlock.iam.flow.api.application.configuration.valueprovider.ValueMapProviderConfig;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForAuthenticationFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForAuthorizationFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForPublicSelfServiceFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForTechClientRegFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForTransactionApprovalFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForUserSelfRegFlows;
import com.airlock.iam.plugin.api.annotation.config.Groups;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.GroupProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@Plugin(description = "Non-interactive step that raises the configured red flag if the configured flow condition evaluates to true.")
@Groups(openGroups = "Basic Settings", groupSequence = {"Basic Settings", "Tags/Guards", "Flow Control"})
public class RedFlagRaisingStepConfig
   extends AbstractFlowStepConfig
   implements StepConfigForAuthorizationFlows,
   StepConfigForAuthenticationFlows,
   StepConfigForUserSelfRegFlows,
   StepConfigForPublicSelfServiceFlows,
   StepConfigForTechClientRegFlows,
   StepConfigForTransactionApprovalFlows,
   NonInteractiveStepConfig {
   @PluginProperty(description = "Defines the condition under which the configured red flag is raised.", optional = false)
   @GroupProperty(groupIdentifier = "Basic Settings")
   private FlowConditionConfig condition;
   @PluginProperty(
      description = "Red flag to be raised if the configured condition evaluates to true. This flag must then be handled by a later step.",
      optional = false
   )
   @GroupProperty(groupIdentifier = "Basic Settings")
   private RedFlagConfig redFlag;
   private final Map<String, StepIdConfig> onFailureGotos = Collections.emptyMap();

   RedFlagRaisingStepConfig(
      FlowConditionConfig skipCondition,
      FlowConditionConfig preCondition,
      boolean requiresActivation,
      List<TagConfig> tagsOnSuccess,
      FlowConditionConfig flowConditionConfig,
      RedFlagConfig redFlagConfig,
      @Nullable StepIdConfig stepId,
      List<ValueMapProviderConfig> customResponseAttributes,
      List<ValueMapProviderConfig> customFailureResponseAttributes
   ) {
      super(
         skipCondition,
         preCondition,
         requiresActivation,
         tagsOnSuccess,
         stepId,
         Collections.emptyMap(),
         customResponseAttributes,
         customFailureResponseAttributes
      );
      this.condition = flowConditionConfig;
      this.redFlag = redFlagConfig;
   }

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

   public RedFlagConfig getRedFlag() {
      return this.redFlag;
   }

   @Override
   public Map<String, StepIdConfig> getOnFailureGotos() {
      return this.onFailureGotos;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public static class RedFlagRaisingStepConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private FlowConditionConfig skipCondition;
      @SuppressFBWarnings(justification = "generated code")
      private FlowConditionConfig preCondition;
      @SuppressFBWarnings(justification = "generated code")
      private boolean requiresActivation;
      @SuppressFBWarnings(justification = "generated code")
      private List<TagConfig> tagsOnSuccess;
      @SuppressFBWarnings(justification = "generated code")
      private FlowConditionConfig flowConditionConfig;
      @SuppressFBWarnings(justification = "generated code")
      private RedFlagConfig redFlagConfig;
      @SuppressFBWarnings(justification = "generated code")
      private StepIdConfig stepId;
      @SuppressFBWarnings(justification = "generated code")
      private List<ValueMapProviderConfig> customResponseAttributes;
      @SuppressFBWarnings(justification = "generated code")
      private List<ValueMapProviderConfig> customFailureResponseAttributes;

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

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder skipCondition(FlowConditionConfig skipCondition) {
         this.skipCondition = skipCondition;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder preCondition(FlowConditionConfig preCondition) {
         this.preCondition = preCondition;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder requiresActivation(boolean requiresActivation) {
         this.requiresActivation = requiresActivation;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder tagsOnSuccess(List<TagConfig> tagsOnSuccess) {
         this.tagsOnSuccess = tagsOnSuccess;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder flowConditionConfig(FlowConditionConfig flowConditionConfig) {
         this.flowConditionConfig = flowConditionConfig;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder redFlagConfig(RedFlagConfig redFlagConfig) {
         this.redFlagConfig = redFlagConfig;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder stepId(@Nullable StepIdConfig stepId) {
         this.stepId = stepId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder customResponseAttributes(List<ValueMapProviderConfig> customResponseAttributes) {
         this.customResponseAttributes = customResponseAttributes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder customFailureResponseAttributes(
         List<ValueMapProviderConfig> customFailureResponseAttributes
      ) {
         this.customFailureResponseAttributes = customFailureResponseAttributes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RedFlagRaisingStepConfig build() {
         return new RedFlagRaisingStepConfig(
            this.skipCondition,
            this.preCondition,
            this.requiresActivation,
            this.tagsOnSuccess,
            this.flowConditionConfig,
            this.redFlagConfig,
            this.stepId,
            this.customResponseAttributes,
            this.customFailureResponseAttributes
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "RedFlagRaisingStepConfig.RedFlagRaisingStepConfigBuilder(skipCondition="
            + this.skipCondition
            + ", preCondition="
            + this.preCondition
            + ", requiresActivation="
            + this.requiresActivation
            + ", tagsOnSuccess="
            + this.tagsOnSuccess
            + ", flowConditionConfig="
            + this.flowConditionConfig
            + ", redFlagConfig="
            + this.redFlagConfig
            + ", stepId="
            + this.stepId
            + ", customResponseAttributes="
            + this.customResponseAttributes
            + ", customFailureResponseAttributes="
            + this.customFailureResponseAttributes
            + ")";
      }
   }
}
