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

import com.airlock.iam.flow.api.application.configuration.dynamicactivation.DynamicStepActivationConfig;
import com.airlock.iam.flow.api.application.configuration.selection.FlowConditionConfig;
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.api.domain.model.flowcontrol.InteractiveGotoTarget;
import com.airlock.iam.flow.api.domain.model.step.FlowStepConfigId;
import com.airlock.iam.flow.api.domain.model.step.StepId;
import com.airlock.iam.plugin.framework.misc.config.properties.ConfigHashCodeBuilder;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public interface FlowStepConfig {
   String SKIP_CONDITION_PROPERTY = "skipCondition";
   String PRE_CONDITION_PROPERTY = "preCondition";
   String TAGS_ON_SUCCESS_PROPERTY = "tagsOnSuccess";

   default Optional<FlowConditionConfig> getPreCondition() {
      return Optional.empty();
   }

   default Optional<FlowConditionConfig> getSkipCondition() {
      return Optional.empty();
   }

   default List<TagConfig> getTagsOnSuccess() {
      return Collections.emptyList();
   }

   default FlowStepConfigId getConfigId() {
      return new FlowStepConfigId(ConfigHashCodeBuilder.reflectionHashCode(this));
   }

   default Optional<StepId> getStepId() {
      return Optional.empty();
   }

   default List<InteractiveGotoTarget> getInteractiveGotoTargets() {
      return Collections.emptyList();
   }

   default List<StepIdConfig> getInternalGotoTargets() {
      return Collections.emptyList();
   }

   default List<DynamicStepActivationConfig> getDynamicStepActivationConfigs() {
      return Collections.emptyList();
   }

   default List<ValueMapProviderConfig> getCustomResponseAttributes() {
      return Collections.emptyList();
   }

   default List<ValueMapProviderConfig> getCustomFailureResponseAttributes() {
      return Collections.emptyList();
   }

   default boolean requiresActivation() {
      return false;
   }

   default Map<String, StepIdConfig> getOnFailureGotos() {
      return Collections.emptyMap();
   }
}
