package com.airlock.iam.authentication.infrastructure.factory;

import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.common.domain.model.user.PrincipalInfoImpl;
import com.airlock.iam.flow.domain.model.session.FlowSessionManager;
import com.airlock.iam.flow.shared.api.domain.model.session.UserSession;
import com.airlock.iam.flow.shared.domain.model.user.TentativeFlowUserId;
import com.airlock.iam.flow.shared.infrastructure.factor.PrincipalInfoFactory;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.Optional;

public final class AuthFlowPrincipalInfoModule extends PrivateModule {
   @Exposed
   @Provides
   PrincipalInfo providePrincipalInfo(Optional<UserSession> userSession, FlowSessionManager flowManager, TentativeFlowUserId tentativeUserId) {
      return userSession.<PrincipalInfo>flatMap(
            session -> session.userId().map(PrincipalInfoImpl::forAuthenticatedIdentity).or(() -> PrincipalInfoFactory.createInfoForTentativeId(flowManager))
         )
         .or(() -> tentativeUserId.getUserIdentity().map(PrincipalInfoImpl::forTentativeIdentity))
         .orElseGet(PrincipalInfoImpl::forUnknownIdentity);
   }

   protected void configure() {
   }
}
