package com.airlock.iam.admin.infrastructure.factory.prot;

import com.airlock.iam.admin.application.configuration.users.UsersConfiguration;
import com.airlock.iam.admin.application.service.token.oauth.OAuthAdminTokenService;
import com.airlock.iam.common.application.configuration.rememberme.RememberMeConfig;
import com.airlock.iam.common.application.configuration.rememberme.RememberMeRepositoryConfig;
import com.airlock.iam.common.domain.service.oauth.OAuth2UserTokenService;
import com.airlock.iam.common.domain.service.rememberme.RememberMeCommonRepository;
import com.airlock.iam.common.domain.service.rememberme.RememberMeTokenService;
import com.airlock.iam.common.domain.service.rememberme.RememberMeTokenServiceImpl;
import com.airlock.iam.common.domain.service.rememberme.RememberMeTokenServiceSettings;
import com.airlock.iam.common.domain.service.token.UserSessionTokenService;
import com.airlock.iam.common.domain.service.token.UserSessionTokenServiceImpl;
import com.airlock.iam.common.infrastructure.rememberme.RememberMeCommonRepositoryImpl;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.Optional;

public class UserSessionTokenServiceModule extends PrivateModule {
   @Provides
   Optional<RememberMeCommonRepository> provideRememberMeCommonRepository(Optional<UsersConfiguration> usersConfiguration) {
      return usersConfiguration.flatMap(UsersConfiguration::getFlowRememberMeSettings)
         .filter(RememberMeConfig::isRemoveRememberMeTokensOnPasswordChanges)
         .map(RememberMeConfig::getRepository)
         .map(RememberMeRepositoryConfig::jooqConfig)
         .map(RememberMeCommonRepositoryImpl::new);
   }

   @Provides
   RememberMeTokenServiceSettings provideRememberMeTokenServiceSettings(Optional<UsersConfiguration> usersConfiguration) {
      return usersConfiguration.flatMap(UsersConfiguration::getFlowRememberMeSettings)
         .map(
            settings -> new RememberMeTokenServiceSettings(
               settings.isRemoveRememberMeTokensOnPasswordChanges(), settings.isRemoveRememberMeTokensOnUserLocked()
            )
         )
         .orElse(new RememberMeTokenServiceSettings(false, false));
   }

   protected void configure() {
      this.bind(OAuth2UserTokenService.class).to(OAuthAdminTokenService.class);
      this.bind(RememberMeTokenService.class).to(RememberMeTokenServiceImpl.class);
      this.bind(UserSessionTokenService.class).to(UserSessionTokenServiceImpl.class);
      this.expose(UserSessionTokenService.class);
   }
}
