package com.airlock.iam.transactionapproval.infrastructure.factory.message;

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.base.domain.service.uri.UrlUtils;
import com.airlock.iam.core.misc.cronto.CrontoHandler;
import com.airlock.iam.transactionapproval.application.configuration.cronto.CrontoMessageProviderImplConfig;
import com.airlock.iam.transactionapproval.domain.model.cronto.CrontoMessageProviderImpl;
import com.airlock.iam.transactionapproval.domain.model.cronto.CrontoMessageProviderKeys;
import com.airlock.iam.transactionapproval.domain.model.message.MessageTranslationKey;
import com.airlock.iam.transactionapproval.domain.model.message.MessageValueEncoder;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;

@ModuleForConfig(CrontoMessageProviderImplConfig.class)
public final class CrontoMessageProviderModule extends PrivateModule {
   @Provides
   @Exposed
   CrontoHandler provideCrontoHandler(CrontoMessageProviderImplConfig config) {
      return config.getCrontoHandler();
   }

   @Provides
   @Exposed
   CrontoMessageProviderKeys provideCrontoKeys(CrontoMessageProviderImplConfig config) {
      return CrontoMessageProviderKeys.builder()
         .amountLabelKey(config.getAmountLabelKey())
         .amountParameterName(config.getAmountParameterName())
         .currencyParameterName(config.getCurrencyParameterName())
         .build();
   }

   @Provides
   @Exposed
   MessageTranslationKey provideMessageTranslationKey(CrontoMessageProviderImplConfig config) {
      return new MessageTranslationKey(config.getMessageTranslationKey());
   }

   @Provides
   @Exposed
   CrontoMessageProviderImpl.PushTranslationKeys providePushMessageKeys(CrontoMessageProviderImplConfig config) {
      return CrontoMessageProviderImpl.PushTranslationKeys.builder()
         .pushTitleTranslationKey(config.getPushTitleResourceKey())
         .pushSubjectTranslationKey(config.getPushSubjectResourceKey())
         .build();
   }

   @Provides
   @Exposed
   MessageValueEncoder provideMessageValueEncoder() {
      return UrlUtils::urlEncodeFormPost;
   }

   protected void configure() {
   }
}
