package com.airlock.iam.flow.domain.model.selection.condition;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.flow.api.domain.model.session.FlowAttributeRepository;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.api.domain.model.step.StepId;
import com.airlock.iam.flow.application.configuration.selection.condition.StepActivationConditionConfig;
import com.airlock.iam.flow.domain.model.dynamicactivation.DynamicStepActivationState;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

@LogicForConfig(StepActivationConditionConfig.class)
public class StepActivationFlowCondition implements FlowCondition {
   private final StepId stepId;
   private final Provider<FlowAttributeRepository> attributes;

   @Inject
   public StepActivationFlowCondition(StepId stepId, Provider<FlowAttributeRepository> attributes) {
      this.stepId = stepId;
      this.attributes = attributes;
   }

   @Override
   public boolean isFulfilled() {
      return this.getStepActivationState().getActivatedSteps().contains(this.stepId);
   }

   private DynamicStepActivationState getStepActivationState() {
      return ((FlowAttributeRepository)this.attributes.get()).tryGetAttribute(DynamicStepActivationState.class).orElseGet(DynamicStepActivationState::new);
   }

   @Override
   public String displayName() {
      return "Is Step " + LogUtil.quote(this.stepId) + " activated";
   }
}
