package com.airlock.iam.oauth2.domain.model.token.revocation;

import com.airlock.iam.oauth2.api.domain.model.clientauthentication.ClientAuthenticationMethod;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2ClientAuthentication;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2ClientAuthenticationPayload;
import com.airlock.iam.oauth2.api.domain.service.clientauthentication.OAuth2ClientAuthenticationVerifier;
import com.airlock.iam.oauth2.domain.model.clientauthentication.NoClientAuthenticationPayload;
import com.airlock.iam.oauth2.domain.model.clientauthentication.OAuth2AuthenticationVerifierSource;
import com.airlock.iam.oauth2.domain.model.clientauthentication.OAuth2ClientSecretAuthenticationPayload;
import com.airlock.iam.oauth2.domain.model.clientauthentication.method.KnownClientAuthenticationMethod;
import com.airlock.iam.oauth2.domain.service.clientauthentication.clientsecret.OAuth2ClientSecretAuthenticationVerifier;
import java.util.Optional;

public final class OAuth2TokenRevocationClientSecretAuthenticationVerifier implements OAuth2ClientAuthenticationVerifier<OAuth2ClientAuthenticationPayload> {
   private final OAuth2ClientSecretAuthenticationVerifier clientSecretAuthenticationVerifier;
   private final ClientAuthenticationMethod clientAuthenticationMethod;

   public OAuth2TokenRevocationClientSecretAuthenticationVerifier(
      OAuth2AuthenticationVerifierSource verifierSource, ClientAuthenticationMethod clientAuthenticationMethod
   ) {
      this.clientSecretAuthenticationVerifier = new OAuth2ClientSecretAuthenticationVerifier(verifierSource);
      this.clientAuthenticationMethod = clientAuthenticationMethod;
   }

   @Override
   public Optional<OAuth2ClientAuthentication> verify(OAuth2ClientAuthenticationPayload payload) {
      if (KnownClientAuthenticationMethod.NONE.equals(this.clientAuthenticationMethod)) {
         return payload instanceof NoClientAuthenticationPayload ? Optional.of(OAuth2ClientAuthentication.clientAuthentication(payload)) : Optional.empty();
      } else {
         return !(payload instanceof OAuth2ClientSecretAuthenticationPayload)
            ? Optional.empty()
            : this.clientSecretAuthenticationVerifier.verify((OAuth2ClientSecretAuthenticationPayload)payload);
      }
   }
}
