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

import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2ClientAuthenticationPayload;
import com.airlock.iam.oauth2.application.configuration.OAuth2AuthorizationServerConfigSpec;
import com.airlock.iam.oauth2.application.service.revocation.OAuth2TokenRevocationService;
import com.airlock.iam.oauth2.domain.service.clientauthentication.OAuth2TokenRevocationClientAuthenticationService;
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;
import java.util.Optional;

public final class TokenRevocationServiceModule extends PrivateModule {
   @Exposed
   @Provides
   @RequestScoped
   Optional<OAuth2TokenRevocationService> provideService(OAuth2AuthorizationServerConfigSpec configSpec) {
      return configSpec.getTokenRevocationService();
   }

   @Exposed
   @Provides
   @RequestScoped
   OAuth2TokenRevocationClientAuthenticationService<OAuth2ClientAuthenticationPayload> provideAuthenticationService(
      OAuth2AuthorizationServerConfigSpec configSpec, OAuth2ReportingService reportingService
   ) {
      return configSpec.getTokenRevocationAuthenticationService(reportingService).orElse(payload -> Optional.empty());
   }

   protected void configure() {
   }
}
