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

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.common.api.domain.model.user.CurrentLocale;
import com.airlock.iam.common.api.domain.model.valueprovider.ValueProvider;
import com.airlock.iam.common.domain.service.email.EmailSenderService;
import com.airlock.iam.common.domain.service.email.EmailSenderServiceImpl;
import com.airlock.iam.core.misc.impl.authen.StringResourceProvider;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.application.configuration.step.email.EmailNotificationStepConfig;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.List;
import java.util.Locale;

@ModuleForConfig(EmailNotificationStepConfig.class)
public class EmailNotificationStepModule extends PrivateModule {
   @Exposed
   @Provides
   EmailSenderService provideEmailSenderService(EmailNotificationStepConfig config, StringResourceProvider stringResourceProvider) {
      return EmailSenderServiceImpl.builder()
         .bodyResourceKey(config.getBodyResourceKey())
         .subjectResourceKey(config.getSubjectResourceKey())
         .emailService(config.getEmailService())
         .sendAsHtml(config.isSendAsHtml())
         .htmlEscapingEnabled(config.isEscapeHtmlValues())
         .stringResourceProvider(stringResourceProvider)
         .build();
   }

   @Exposed
   @Provides
   Locale provideLocale(CurrentLocale currentLocale) {
      return currentLocale.get();
   }

   @Exposed
   @Provides
   ValueProvider<String> provideRecipientAddressValueProvider(EmailNotificationStepConfig config, PluginConfigToLogic toLogic) {
      return toLogic.getLogic(config.getRecipientAddressProvider());
   }

   @Provides
   @Exposed
   List<ValueMapProvider> provideValueMapProviderList(EmailNotificationStepConfig config, PluginConfigToLogic toLogic) {
      return config.getValueMapProviders().stream().map(valueMapProviderConfig -> toLogic.getLogic(valueMapProviderConfig)).toList();
   }

   protected void configure() {
   }
}
