package com.airlock.iam.publicselfservice.infrastructure.factory.shared;

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.core.misc.impl.authen.mtan.MtanHandler;
import com.airlock.iam.core.misc.impl.token.MtanItem;
import com.airlock.iam.publicselfservice.application.configuration.restrictions.NoMtanTokenRestrictionConfig;
import com.airlock.iam.publicselfservice.domain.service.repository.PublicSelfServiceMtanTokenRepository;
import com.airlock.iam.publicselfservice.infrastructure.service.mtan.PublicSelfServiceMtanTokenRepositoryImpl;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.Optional;

@ModuleForConfig(NoMtanTokenRestrictionConfig.class)
public class NoMtanTokenRestrictionModule extends PrivateModule {
   @Provides
   MtanHandler provideMtanHandler(NoMtanTokenRestrictionConfig config) {
      return config.getMtanHandler();
   }

   @Exposed
   @Provides
   Optional<MtanItem> provideOptionalMtanItem(PublicSelfServiceMtanTokenRepository repository, PrincipalInfo principalInfo) {
      return principalInfo.getKnownIdentity().flatMap(id -> repository.getMtanToken(id.id()));
   }

   protected void configure() {
      this.bind(PublicSelfServiceMtanTokenRepository.class).to(PublicSelfServiceMtanTokenRepositoryImpl.class);
   }
}
