package com.airlock.iam.oauth2.domain.model.clientauthentication;

import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientSecret;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2AuthClientId;
import com.airlock.iam.oauth2.domain.model.client.OAuth2ClientLoader;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import lombok.NonNull;

public final class DefaultOAuth2AuthenticationVerifierSource implements OAuth2AuthenticationVerifierSource {
   @NonNull
   private final OAuth2ClientLoader clientLoader;

   @Override
   public Optional<OAuth2ClientAuthenticationData> verificationData(OAuth2AuthClientId clientIdFromPayload) {
      return this.clientLoader
         .tryLoadClient(OAuth2ClientId.oAuth2ClientId(clientIdFromPayload.id()))
         .map(
            client -> new OAuth2ClientAuthenticationData(
               client.clientId(), client.clientSecret().map(OAuth2ClientSecret::getSecret), client.clientCertificates()
            )
         );
   }

   @SuppressFBWarnings(justification = "generated code")
   public DefaultOAuth2AuthenticationVerifierSource(@NonNull OAuth2ClientLoader clientLoader) {
      if (clientLoader == null) {
         throw new NullPointerException("clientLoader is marked non-null but is null");
      }

      this.clientLoader = clientLoader;
   }
}
