package com.airlock.iam.flow.shared.domain.service;

import com.airlock.iam.flow.api.domain.model.session.FlowAttribute;
import com.airlock.iam.flow.domain.model.session.InternalFlowSession;
import com.airlock.iam.flow.shared.api.domain.model.session.UserSessionScopedFlowAttribute;
import com.airlock.iam.flow.shared.api.domain.service.FlowAttributeService;
import com.airlock.iam.flow.shared.domain.model.session.MultiFlowCapableUserSession;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public final class FlowAttributeServiceImpl implements FlowAttributeService {
   private final Provider<MultiFlowCapableUserSession> userSession;

   @Inject
   public FlowAttributeServiceImpl(Provider<MultiFlowCapableUserSession> userSession) {
      this.userSession = userSession;
   }

   @Override
   public <T extends FlowAttribute<T>> Optional<T> findAttribute(Class<T> attributeClass) {
      Optional<InternalFlowSession> flowSession = ((MultiFlowCapableUserSession)this.userSession.get()).getCurrentFlowSession();
      if (flowSession.isPresent()) {
         return flowSession.get().flowAttributes().tryGetAttribute(attributeClass);
      } else if (UserSessionScopedFlowAttribute.class.isAssignableFrom(attributeClass)) {
         Class<UserSessionScopedFlowAttribute<?>> casted = attributeClass;
         return ((MultiFlowCapableUserSession)this.userSession.get()).findUserSessionAttribute(casted);
      } else {
         return Optional.empty();
      }
   }
}
