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

import com.airlock.iam.admin.application.configuration.users.UsersConfiguration;
import com.airlock.iam.admin.application.configuration.users.UsersOAuth2AuthorizationServerConfig;
import com.airlock.iam.admin.application.service.token.oauth.OAuth2AdminTokenServiceSettings;
import com.airlock.iam.oauth2.api.domain.model.AuthorizationServerId;
import com.airlock.iam.oauth2.infrastructure.repository.OAuth2ExtendedSessionRepositoryImpl;
import com.airlock.iam.oauth2.infrastructure.repository.OAuth2SessionRepositorySettings;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

public final class OAuth2AdminTokenServiceModule extends PrivateModule {
   @Provides
   @Exposed
   List<OAuth2AdminTokenServiceSettings> provideOAuth2AdminTokenServiceSettings(Optional<UsersConfiguration> usersConfiguration) {
      return usersConfiguration.map(UsersConfiguration::getOauth2AuthorizationServers)
         .map(configs -> configs.stream().map(OAuth2AdminTokenServiceModule::adminTokenServiceSettings).toList())
         .orElse(Collections.emptyList());
   }

   protected void configure() {
   }

   private static OAuth2AdminTokenServiceSettings adminTokenServiceSettings(UsersOAuth2AuthorizationServerConfig config) {
      OAuth2SessionRepositorySettings settings = new OAuth2SessionRepositorySettings(config.getSessionRepository().jooqConfig(), false);
      return new OAuth2AdminTokenServiceSettings(
         AuthorizationServerId.authorizationServerId(config.getAuthorizationServerIdentifier().getIdentifier()),
         new OAuth2ExtendedSessionRepositoryImpl(
            () -> settings, () -> AuthorizationServerId.authorizationServerId(config.getAuthorizationServerIdentifier().getIdentifier())
         ),
         config.isDeleteTokensOnPasswordChange(),
         config.isDeleteTokensOnUserLocked()
      );
   }
}
