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

import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.oauth2.application.configuration.OAuth2AuthorizationServerConfigSpec;
import com.airlock.iam.oauth2.application.configuration.OAuth2ClientRegistrationConfig;
import com.airlock.iam.techclientreg.application.configuration.oauth2dcr.DefaultOAuth2ClientRegistrationConfig;
import com.airlock.iam.techclientreg.application.configuration.step.OAuth2ClientRegistrationStepConfig;
import com.airlock.iam.techclientreg.domain.model.step.OAuth2ClientRegistrationStepImpl;
import com.airlock.iam.techclientreg.domain.service.OAuth2ClientRegistrationLogic;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;

@ModuleForConfig(OAuth2ClientRegistrationStepConfig.class)
public class OAuth2ClientRegistrationStepModule extends PrivateModule {
   @Provides
   @Exposed
   OAuth2ClientRegistrationLogic provideRegistrationLogic(OAuth2AuthorizationServerConfigSpec configSpec, PluginConfigToLogic configToLogic) {
      OAuth2ClientRegistrationConfig config = ServiceConfigurationException.checkPresent(
         configSpec.getDynamicClientRegistration(), "Authorization Server does not support Dynamic Client Registration."
      );
      return configToLogic.getLogic(config);
   }

   @Provides
   @Exposed
   OAuth2ClientRegistrationStepImpl.OAuth2ClientRegistrationStepSettings provideSettings(OAuth2AuthorizationServerConfigSpec configSpec) {
      OAuth2ClientRegistrationConfig config = ServiceConfigurationException.checkPresent(
         configSpec.getDynamicClientRegistration(), "Authorization Server does not support Dynamic Client Registration."
      );
      if (config instanceof DefaultOAuth2ClientRegistrationConfig defaultConfig) {
         return new OAuth2ClientRegistrationStepImpl.OAuth2ClientRegistrationStepSettings(defaultConfig.returnTechClientId());
      } else {
         throw new ServiceConfigurationException("Unknown OAuth 2.0 Dynamic Client Registration configuration type: " + config.getClass().getName());
      }
   }

   protected void configure() {
   }
}
