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

import com.airlock.iam.admin.application.configuration.event.AdminappRemoteEventSubscriberConfig;
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.domain.model.event.RemoteEventSubscriberSettings;
import com.airlock.iam.common.domain.service.event.UserEventStringTemplateResolver;
import com.airlock.iam.common.infrastructure.event.UserEventStringTemplateResolverImpl;
import com.airlock.iam.core.domain.model.http.client.HttpClient;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.io.IOException;
import java.security.GeneralSecurityException;

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

   @Exposed
   @Provides
   RemoteEventSubscriberSettings provideRemoteEventSubscriberSettings(AdminappRemoteEventSubscriberConfig config) {
      return new RemoteEventSubscriberSettings(
         config.getHttpMethod(), config.getRemoteUrl(), config.getBodyTemplate(), config.getContentType(), config.getValueEncoding()
      );
   }

   @Exposed
   @Provides
   HttpClient provideHttpClient(AdminappRemoteEventSubscriberConfig config) throws GeneralSecurityException, IOException {
      return config.getHttpClient().createHttpClientForDomainClasses();
   }

   protected void configure() {
      this.bind(UserEventStringTemplateResolver.class).to(UserEventStringTemplateResolverImpl.class);
      this.expose(UserEventStringTemplateResolver.class);
   }
}
