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

import com.airlock.iam.admin.api.domain.service.user.ManagedUserRepository;
import com.airlock.iam.admin.application.configuration.event.AdminappEmailEventSubscriberConfig;
import com.airlock.iam.admin.domain.model.event.ManagedUserLocaleProvider;
import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.base.domain.model.event.SubscribedEvent;
import com.airlock.iam.common.api.domain.service.email.EmailService;
import com.airlock.iam.common.domain.model.email.EmailMessageTemplate;
import com.airlock.iam.common.domain.model.encoder.IdentityValueMapEncoder;
import com.airlock.iam.common.domain.model.encoder.ValueMapEncoder;
import com.airlock.iam.common.domain.model.encoder.ValueMapStringEncoder;
import com.airlock.iam.common.domain.model.locale.ResourceKey;
import com.airlock.iam.common.domain.service.event.DomainEventMessageProvider;
import com.airlock.iam.common.domain.service.event.LocaleProvider;
import com.airlock.iam.common.infrastructure.event.DomainEventMessageProviderImpl;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.inject.Provider;
import org.apache.commons.text.StringEscapeUtils;

@ModuleForConfig(AdminappEmailEventSubscriberConfig.class)
public final class AdminappEmailEventSubscriberModule extends PrivateModule {
   @Provides
   @Exposed
   SubscribedEvent provideSubscribedEvent(AdminappEmailEventSubscriberConfig config, PluginConfigToLogic toLogic) {
      return (SubscribedEvent)toLogic.getLogic(config.getEvent());
   }

   @Exposed
   @Provides
   EmailService provideEmailService(AdminappEmailEventSubscriberConfig config) {
      return config.getEmailService();
   }

   @Exposed
   @Provides
   EmailMessageTemplate provideEmailResourceKeys(AdminappEmailEventSubscriberConfig config) {
      return new EmailMessageTemplate(
         ResourceKey.resourceKey(config.getSubjectResourceKey()), ResourceKey.resourceKey(config.getBodyResourceKey()), config.isSendAsHtml()
      );
   }

   @Provides
   LocaleProvider provideLocaleProvider(AdminappEmailEventSubscriberConfig config, Provider<ManagedUserRepository> repository) {
      return ManagedUserLocaleProvider.builder()
         .repository(repository)
         .languageContextDataname(config.getLanguageContextDataName().getContextDataName())
         .defaultLocale(config.getDefaultLocale())
         .build();
   }

   @Provides
   ValueMapEncoder provideValueMapEncoder(AdminappEmailEventSubscriberConfig config) {
      return (ValueMapEncoder)(config.isSendAsHtml() ? new ValueMapStringEncoder(StringEscapeUtils::escapeHtml4) : new IdentityValueMapEncoder());
   }

   protected void configure() {
      this.bind(DomainEventMessageProvider.class).to(DomainEventMessageProviderImpl.class);
      this.expose(DomainEventMessageProvider.class);
   }
}
