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

import com.airlock.iam.flow.api.application.configuration.sequence.FlowStepSequence;
import com.airlock.iam.flow.api.domain.model.selection.Option;
import com.airlock.iam.flow.application.configuration.selection.CommonSelectionStepConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

public final class InitializedSelectionOptions {
   private final Set<Option> optionSet;
   private final Map<Option, FlowStepSequence> subflowsByOption;

   public InitializedSelectionOptions(Map<Option, FlowStepSequence> optionsMap) {
      this.optionSet = optionsMap.keySet();
      this.subflowsByOption = Collections.unmodifiableMap(optionsMap);
   }

   public static InitializedSelectionOptions createInitializedOptions(CommonSelectionStepConfig config) {
      Map<Option, FlowStepSequence> options = new HashMap<>();
      config.getAvailableOptions().forEach(option -> options.put(option.getOption(), option.getFlowStepSequence()));
      if (config.hasFallbackFlow()) {
         options.put(Option.FALLBACK_OPTION, new FlowStepSequence(config.getFallbackFlow()));
      }

      return new InitializedSelectionOptions(options);
   }

   public FlowStepSequence getSubFlowForOption(Option option) {
      return Objects.requireNonNull(this.subflowsByOption.get(option), "unknown selection option: " + option);
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<Option> getOptionSet() {
      return this.optionSet;
   }
}
