package com.airlock.iam.flow.infrastructure.step;

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.flow.api.domain.model.session.FlowSession;
import com.airlock.iam.flow.api.domain.model.step.StepSession;
import java.util.Optional;

public final class StepSessionModuleHelper {
   private StepSessionModuleHelper() {
   }

   public static <T extends StepSession> T retrieveStepSession(FlowSession flowSession, Class<T> expectedType) {
      Optional<StepSession> currentStepSession = flowSession.getCurrentStepSession();
      ViolationException.checkTrue(
         currentStepSession.isPresent() && expectedType.isAssignableFrom(currentStepSession.get().getClass()),
         "Flow session does not contain step session of type " + expectedType.getSimpleName()
      );
      return (T)currentStepSession.get();
   }

   public static <T extends StepSession> Optional<T> tryRetrieveStepSession(FlowSession flowSession, Class<T> expectedType) {
      Optional<StepSession> currentStepSession = flowSession.getCurrentStepSession();
      currentStepSession.ifPresent(
         s -> ViolationException.checkTrue(
            expectedType.isAssignableFrom(currentStepSession.get().getClass()),
            "Flow session does not contain step session of expected type " + expectedType.getSimpleName()
         )
      );
      return (Optional<T>)currentStepSession;
   }
}
