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.application.configuration.step.FlowStepConfig;
import com.airlock.iam.flow.api.application.configuration.step.StepIdConfig;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.impl.domain.model.step.GotoTargetData;
import jakarta.inject.Inject;
import java.util.Map;

public final class OnFailureGotosImpl implements OnFailureGotos {
   private static final ELogger LOG = ELoggerFactory.getLogger(OnFailureGotosImpl.class);

   @Override
   public StepResult executeGotoOnFailure(StepResult result, FlowStepConfig stepConfig) {
      if (!result.error().isEmpty() && result.isFinalFailure()) {
         Map<String, StepIdConfig> gotos = stepConfig.getOnFailureGotos();
         StepIdConfig target = gotos.get(result.error().get().name());
         if (target == null) {
            return result;
         }

         LOG.info(
            "Changing failing step result with error "
               + LogUtil.quote(result.error().get())
               + " to fail-goto with target step ID "
               + LogUtil.quote(target.getId())
         );
         return result.toBuilder().type(StepResult.StepResultType.FAIL_GOTO).internalResultData(new GotoTargetData(target.getId())).nextAction(null).build();
      } else {
         return result;
      }
   }
}
