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

import com.airlock.iam.admin.application.configuration.accountlink.AccountLinkManagementConfig;
import com.airlock.iam.admin.application.configuration.users.UsersConfiguration;
import com.airlock.iam.admin.application.service.accountlink.AccountLinkService;
import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.common.application.configuration.accountlink.persistence.AccountLinkPersisterConfig;
import com.airlock.iam.common.domain.service.accountlink.persistence.AccountLinkPersister;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.Optional;

public class AccountLinkServiceModule extends PrivateModule {
   @Provides
   Optional<AccountLinkPersister> provideAccountLinkPersister(Optional<UsersConfiguration> userConfig) {
      return userConfig.<AccountLinkManagementConfig>flatMap(config -> config.getAccountLinkManagementConfig())
         .map(AccountLinkManagementConfig::getAccountLinkPersister)
         .map(AccountLinkPersisterConfig::persister);
   }

   @Provides
   @Exposed
   Optional<AccountLinkService> provideOptionalAccountLinkService(Optional<AccountLinkPersister> accountLinkPersister) {
      return accountLinkPersister.map(AccountLinkService::new);
   }

   @Provides
   @Exposed
   AccountLinkService provideAccountLinkService(Optional<AccountLinkPersister> accountLinkPersister) {
      return new AccountLinkService(
         (AccountLinkPersister)ServiceConfigurationException.checkPresent(accountLinkPersister, "Account Link Persister not configured")
      );
   }

   protected void configure() {
   }
}
