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

import com.airlock.iam.common.domain.model.jwt.signature.KeyId;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.security.PublicKey;
import java.util.List;
import java.util.Optional;

public final class OAuth2ClientPublicKeys implements OAuth2ClientPublicKeyProvider {
   private static final ELogger LOG = ELoggerFactory.getLogger(OAuth2ClientPublicKeys.class);
   private List<OAuth2ClientPublicKey> publicKeys;

   @Override
   public Optional<PublicKey> getKeyFor(Optional<KeyId> keyId) {
      if (this.publicKeys.size() <= 1 && keyId.isEmpty()) {
         return this.publicKeys.stream().map(OAuth2ClientPublicKey::getPublicKey).findFirst();
      } else if (keyId.isEmpty()) {
         LOG.debug("No key ID provided in JWT but multiple public keys are configured.");
         return Optional.empty();
      } else {
         return this.publicKeys.stream().map(pk -> pk.getKeyFor(keyId)).filter(Optional::isPresent).map(Optional::get).findFirst();
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2ClientPublicKeys(List<OAuth2ClientPublicKey> publicKeys) {
      this.publicKeys = publicKeys;
   }
}
