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

import com.airlock.iam.authentication.application.configuration.targetapp.TargetApplicationsConfig;
import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.common.api.domain.model.user.UserIdentity;
import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.login.application.configuration.existingsessionbehavior.ExistingUserSessionBehaviorConfig;
import com.airlock.iam.login.domain.model.existingsessionbehavior.DisabledExistingUserSessionBehaviorLogic;
import com.airlock.iam.login.domain.model.existingsessionbehavior.ExistingUserSessionBehaviorLogic;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.Optional;

public final class ExistingUserSessionBehaviorLogicModule extends PrivateModule {
   private static final ELogger LOG = ELoggerFactory.getLogger(ExistingUserSessionBehaviorLogicModule.class);
   private static final ExistingUserSessionBehaviorLogic DISABLED_LOGIC = new DisabledExistingUserSessionBehaviorLogic();

   @Exposed
   @Provides
   ExistingUserSessionBehaviorLogic provideExistingUserSessionBehaviorLogic(
      Optional<TargetApplicationsConfig> authFlows, PrincipalInfo user, PluginConfigToLogic toLogic
   ) {
      if (authFlows.isEmpty()) {
         return DISABLED_LOGIC;
      } else if (authFlows.get().isDisableSessionBehaviorWhenRepresented() && user.getKnownIdentity().flatMap(UserIdentity::representerId).isPresent()) {
         LOG.debug("Disabling behavior upon existing session because the current user is being represented.");
         return DISABLED_LOGIC;
      } else {
         ExistingUserSessionBehaviorConfig config = authFlows.get().getBehaviorUponExistingSession();
         return toLogic.getLogic(config);
      }
   }

   protected void configure() {
   }
}
