package com.airlock.iam.flow.shared.application.service.airlock2fa;

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceId;
import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.domain.model.flow.FlowProvider;
import com.airlock.iam.flow.shared.domain.model.airlock2fa.Airlock2FARecoveryFlowBindingStep;
import jakarta.inject.Inject;
import java.util.List;
import java.util.function.Function;

public final class Airlock2FARecovery {
   private final FlowProvider flow;

   @Inject
   public Airlock2FARecovery(FlowProvider flow) {
      this.flow = flow;
   }

   public FlowResult pollRecoveryResult() {
      return this.executeStepMethod(Airlock2FARecoveryFlowBindingStep::pollRecoveryResult);
   }

   public FlowResult startRecovery(List<Airlock2FADeviceId> deviceIds) {
      return this.executeStepMethod(step -> step.startRecovery(deviceIds));
   }

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