package com.airlock.iam.flow.shared.infrastructure.factory;

import com.airlock.iam.flow.shared.api.domain.model.session.UserSession;
import com.airlock.iam.flow.shared.domain.model.session.FlowBasedIamSession;
import com.airlock.iam.flow.shared.domain.model.session.MultiFlowCapableUserSession;
import com.airlock.iam.flow.shared.domain.model.session.UserSessionImpl;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.Optional;

public final class UserSessionModule extends PrivateModule {
   @Provides
   @RequestScoped
   UserSessionImpl provideUserSessionImpl(FlowBasedIamSession iamSession) {
      return iamSession.getUserSession();
   }

   @Exposed
   @Provides
   Optional<UserSession> provideOptionalUserSession(FlowBasedIamSession iamSession) {
      return iamSession.isLockAcquired() ? Optional.of(iamSession.getUserSession()) : Optional.empty();
   }

   protected void configure() {
      this.bind(MultiFlowCapableUserSession.class).to(UserSessionImpl.class).in(RequestScoped.class);
      this.bind(UserSession.class).to(UserSessionImpl.class).in(RequestScoped.class);
      this.expose(MultiFlowCapableUserSession.class);
      this.expose(UserSession.class);
   }
}
