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

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.flow.shared.application.configuration.item.mtan.MtanLabelItemDefinitionConfig;
import com.airlock.iam.flow.shared.application.configuration.item.mtan.MtanNumberItemDefinitionConfig;
import com.airlock.iam.flow.shared.application.configuration.step.CommonDataEditStepConfig;
import com.airlock.iam.flow.shared.application.configuration.step.mtan.MtanTokenRegistrationStepConfig;
import com.airlock.iam.flow.shared.domain.model.item.mtan.MtanNumberItems;
import com.airlock.iam.flow.shared.domain.service.mtan.MtanTokenChangeService;
import com.airlock.iam.flow.shared.domain.service.user.EditableItemChangeServiceList;
import com.airlock.iam.flow.shared.domain.service.user.EditableItemChangeServiceListImpl;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;

@ModuleForConfig(MtanTokenRegistrationStepConfig.class)
public final class MtanTokenRegistrationStepAuthModule extends PrivateModule {
   @Provides
   @Exposed
   MtanNumberItems provideMtanNumberItems(MtanTokenRegistrationStepConfig config, PluginConfigToLogic toLogic) {
      return MtanNumberItems.builder()
         .numberItem(config.getUserDataItems().stream().filter(MtanNumberItemDefinitionConfig.class::isInstance).findFirst().map(toLogic::getLogic))
         .labelItem(config.getUserDataItems().stream().filter(MtanLabelItemDefinitionConfig.class::isInstance).findFirst().map(toLogic::getLogic))
         .build();
   }

   @Provides
   @Exposed
   EditableItemChangeServiceList provideEditableItemChangeServiceList(MtanTokenChangeService mtanChangeService) {
      return EditableItemChangeServiceListImpl.builder().service(mtanChangeService).build();
   }

   @Provides
   @Exposed
   CommonDataEditStepConfig.NextDataEditActions provideNextDataEditActions() {
      return MtanTokenRegistrationStepConfig.MTAN_TOKEN_REGISTRATION_ACTIONS;
   }

   protected void configure() {
   }
}
