package com.airlock.iam.authentication.application.service.migration;

import com.airlock.iam.authentication.domain.model.migration.MigrationSelectionStep;
import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import com.airlock.iam.flow.api.domain.model.selection.Option;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.domain.model.flow.FlowProvider;
import jakarta.inject.Inject;
import java.util.function.Function;

public final class MigrationSelection {
   private final FlowProvider flowProvider;

   @Inject
   public MigrationSelection(FlowProvider flowProvider) {
      this.flowProvider = flowProvider;
   }

   public FlowResult retrieveOptions() {
      return this.executeStepMethod(MigrationSelectionStep::retrieveOptions);
   }

   public FlowResult select(Option option) {
      return this.executeStepMethod(step -> step.select(option));
   }

   public FlowResult skip() {
      return this.executeStepMethod(MigrationSelectionStep::skip);
   }

   public FlowResult reject() {
      return this.executeStepMethod(MigrationSelectionStep::reject);
   }

   private FlowResult executeStepMethod(Function<MigrationSelectionStep, StepResult> stepMethod) {
      return this.flowProvider.getCurrentOrStartNew().execute(stepMethod, MigrationSelectionStep.class);
   }
}
