package com.airlock.iam.flow.domain.model.step;

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import com.airlock.iam.flow.api.domain.model.step.StepId;
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 InteractiveGoto {
   private static final ELogger LOG = ELoggerFactory.getLogger(InteractiveGoto.class);
   private final FlowProvider flow;

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

   public FlowResult retrieveGotoTargets() {
      return this.executeStepMethod(GotoCapableStep::retrieveGotoTargets);
   }

   public FlowResult doGoto(StepId target) {
      LOG.info("Executing interactive goto to step id " + LogUtil.quote(target.getStepId()));
      return this.executeStepMethod(step -> step.doGoto(target));
   }

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