package com.airlock.iam.plugin.configeditor.ui.flowviz;

import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import java.util.Optional;

public record FlowVisualizationModel(
   String id, String title, ConfigurationEnvironment environment, ConfigurationContext context, FlowVisualizationModel.Flow flow
) {
   public record Flow(List<FlowVisualizationModel.Step> steps) {
   }

   public static final class SelectionOption {
      private final String name;
      private final Optional<String> condition;
      private final FlowVisualizationModel.Flow flow;

      public SelectionOption(String name, String condition, FlowVisualizationModel.Flow subFlow) {
         this.name = name;
         this.condition = Optional.of(condition);
         this.flow = subFlow;
      }

      public SelectionOption(String name, FlowVisualizationModel.Flow subFlow) {
         this.name = name;
         this.condition = Optional.empty();
         this.flow = subFlow;
      }

      @SuppressFBWarnings(justification = "generated code")
      public String getName() {
         return this.name;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Optional<String> getCondition() {
         return this.condition;
      }

      @SuppressFBWarnings(justification = "generated code")
      public FlowVisualizationModel.Flow getFlow() {
         return this.flow;
      }
   }

   public static final class SelectionStep extends FlowVisualizationModel.Step {
      private final List<FlowVisualizationModel.SelectionOption> options;
      private final Optional<FlowVisualizationModel.Flow> fallback;

      public SelectionStep(
         String stepName,
         List<FlowVisualizationModel.SelectionOption> options,
         Optional<FlowVisualizationModel.Flow> fallback,
         boolean interactive,
         Optional<String> preCondition,
         Optional<String> skipCondition,
         Optional<String> stepId,
         List<String> gotoTargets,
         List<String> dynamicStepActivations,
         boolean requiresActivation
      ) {
         super(stepName, interactive, preCondition, skipCondition, List.of(), stepId, gotoTargets, dynamicStepActivations, requiresActivation);
         this.options = options;
         this.fallback = fallback;
      }

      @SuppressFBWarnings(justification = "generated code")
      public List<FlowVisualizationModel.SelectionOption> getOptions() {
         return this.options;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Optional<FlowVisualizationModel.Flow> getFallback() {
         return this.fallback;
      }
   }

   public static class Step {
      private final String stepName;
      private final boolean interactive;
      private final Optional<String> preCondition;
      private final Optional<String> skipCondition;
      private final List<String> tagsOnSuccess;
      private final Optional<String> stepId;
      private final List<String> gotoTargets;
      private final List<String> dynamicStepActivations;
      private final boolean requiresActivation;

      @SuppressFBWarnings(justification = "generated code")
      public String getStepName() {
         return this.stepName;
      }

      @SuppressFBWarnings(justification = "generated code")
      public boolean isInteractive() {
         return this.interactive;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Optional<String> getPreCondition() {
         return this.preCondition;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Optional<String> getSkipCondition() {
         return this.skipCondition;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      public Optional<String> getStepId() {
         return this.stepId;
      }

      @SuppressFBWarnings(justification = "generated code")
      public List<String> getGotoTargets() {
         return this.gotoTargets;
      }

      @SuppressFBWarnings(justification = "generated code")
      public List<String> getDynamicStepActivations() {
         return this.dynamicStepActivations;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      public Step(
         String stepName,
         boolean interactive,
         Optional<String> preCondition,
         Optional<String> skipCondition,
         List<String> tagsOnSuccess,
         Optional<String> stepId,
         List<String> gotoTargets,
         List<String> dynamicStepActivations,
         boolean requiresActivation
      ) {
         this.stepName = stepName;
         this.interactive = interactive;
         this.preCondition = preCondition;
         this.skipCondition = skipCondition;
         this.tagsOnSuccess = tagsOnSuccess;
         this.stepId = stepId;
         this.gotoTargets = gotoTargets;
         this.dynamicStepActivations = dynamicStepActivations;
         this.requiresActivation = requiresActivation;
      }
   }
}
