package com.airlock.iam.oauth2.domain.service.clientauthentication.clientsecret;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.ClientAuthenticationMethod;
import com.airlock.iam.oauth2.api.domain.service.clientauthentication.OAuth2ClientAuthentication;
import com.airlock.iam.oauth2.api.domain.service.clientauthentication.OAuth2ClientAuthenticationParser;
import com.airlock.iam.oauth2.api.domain.service.clientauthentication.OAuth2ClientAuthenticationVerifier;
import com.airlock.iam.oauth2.application.configuration.clientauthentication.OAuth2ClientSecretAuthenticationConfig;
import com.airlock.iam.oauth2.domain.model.clientauthentication.OAuth2AuthenticationVerifierSource;
import com.airlock.iam.oauth2.domain.model.clientauthentication.OAuth2ClientSecretAuthenticationPayload;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;

@LogicForConfig(OAuth2ClientSecretAuthenticationConfig.class)
public final class OAuth2ClientSecretAuthentication implements OAuth2ClientAuthentication<OAuth2ClientSecretAuthenticationPayload> {
   private final Provider<OAuth2AuthenticationVerifierSource> verifierSource;
   private final Provider<OAuth2ClientSecretMethod> clientSecretMethod;

   @Inject
   public OAuth2ClientSecretAuthentication(Provider<OAuth2AuthenticationVerifierSource> verifierSource, Provider<OAuth2ClientSecretMethod> clientSecretMethod) {
      this.verifierSource = verifierSource;
      this.clientSecretMethod = clientSecretMethod;
   }

   @Override
   public List<ClientAuthenticationMethod> supportedAuthenticationMethods() {
      return List.of(((OAuth2ClientSecretMethod)this.clientSecretMethod.get()).clientAuthenticationMethod());
   }

   @Override
   public OAuth2ClientAuthenticationParser<OAuth2ClientSecretAuthenticationPayload> authenticationParser() {
      return new OAuth2ClientSecretAuthenticationParser((OAuth2ClientSecretMethod)this.clientSecretMethod.get());
   }

   @Override
   public OAuth2ClientAuthenticationVerifier<OAuth2ClientSecretAuthenticationPayload> verifier() {
      return new OAuth2ClientSecretAuthenticationVerifier((OAuth2AuthenticationVerifierSource)this.verifierSource.get());
   }
}
