package com.airlock.iam.oauth2.infrastructure.factory.rest;

import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.oauth2.application.configuration.OAuth2AuthorizationServerConfigSpec;
import com.airlock.iam.oauth2.application.configuration.introspection.TokenIntrospectionSettings;
import com.airlock.iam.oauth2.application.service.introspection.BasicAuthTokenIntrospectionAuthService;
import com.airlock.iam.oauth2.application.service.introspection.TokenIntrospectionAuthService;
import com.airlock.iam.oauth2.application.service.introspection.TokenIntrospectionService;
import com.airlock.iam.oauth2.domain.service.reporting.OAuth2ReportingService;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;

public final class TokenIntrospectionServiceModule extends PrivateModule {
   @Provides
   @RequestScoped
   TokenIntrospectionSettings provideTokenIntrospectionSettings(OAuth2AuthorizationServerConfigSpec configSpec) {
      return ServiceConfigurationException.checkPresent(configSpec.getTokenIntrospectionSettings(), "Token Introspection endpoint not configured.");
   }

   @Exposed
   @Provides
   @RequestScoped
   TokenIntrospectionService provideTokenIntrospectionService(TokenIntrospectionSettings settings) {
      return settings.getTokenIntrospectionService();
   }

   @Exposed
   @Provides
   @RequestScoped
   TokenIntrospectionAuthService provideBasicAuthValidationService(TokenIntrospectionSettings settings, OAuth2ReportingService reportingService) {
      return new BasicAuthTokenIntrospectionAuthService(
         settings.getAuthenticationConfig().getCharset(),
         settings.getAuthenticationConfig().getUsernamePasswordCombinations(),
         ELoggerFactory.getLogger(BasicAuthTokenIntrospectionAuthService.class),
         reportingService
      );
   }

   protected void configure() {
   }
}
