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

import com.airlock.iam.core.application.configuration.waf.AirlockGatewayConfig;
import com.airlock.iam.oauth2.application.configuration.OAuth2AuthorizationServerConfigSpec;
import com.airlock.iam.oauth2.domain.model.credential.OAuth2TokenBindingCredentialExtractor;
import com.airlock.iam.oauth2.domain.service.credential.OAuth2AccessTokenValidationService;
import com.airlock.iam.oauth2.domain.service.credential.OAuth2AccessTokenValidationServiceImpl;
import com.airlock.iam.oauth2.domain.service.persistence.OAuth2UserLoader;
import com.airlock.iam.oauth2.domain.service.token.OAuth2LoginTokenService;
import com.airlock.iam.oauth2.domain.service.token.OAuth2TokenBindingVerifier;
import com.airlock.iam.oauth2.infrastructure.credential.OAuth2TokenBindingClientCertificateCredentialExtractor;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Optional;

public class OAuth2AccessTokenValidationServiceModule extends PrivateModule {
   @Provides
   OAuth2LoginTokenService provideOAuth2LoginTokenService(OAuth2AuthorizationServerConfigSpec configSpec) {
      return configSpec.loginTokenService();
   }

   @Provides
   OAuth2UserLoader provideOAuth2UserLoader(OAuth2AuthorizationServerConfigSpec configSpec) {
      return configSpec.getUserLoader();
   }

   @Provides
   OAuth2TokenBindingVerifier provideOAuth2TokenBindingVerifier(OAuth2AuthorizationServerConfigSpec configSpec) {
      return configSpec.getTokenBindingVerifier();
   }

   @Provides
   OAuth2TokenBindingCredentialExtractor provideOAuth2TokenBindingCredentialExtractor(HttpServletRequest request, Optional<AirlockGatewayConfig> wafConfig) {
      return new OAuth2TokenBindingClientCertificateCredentialExtractor(request, wafConfig);
   }

   protected void configure() {
      this.bind(OAuth2AccessTokenValidationService.class).to(OAuth2AccessTokenValidationServiceImpl.class).in(RequestScoped.class);
      this.expose(OAuth2AccessTokenValidationService.class);
   }
}
