package com.airlock.iam.techclientreg.domain.model.registration;

import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.techclient.api.domain.model.oauth2.OAuth2TechnicalClientMetadataBuilder;
import com.airlock.iam.techclientreg.api.domain.model.oauth2.OAuth2ClientRegistrationError;
import com.airlock.iam.techclientreg.api.domain.model.oauth2.OAuth2ClientRegistrationMetadata;
import com.airlock.iam.techclientreg.api.domain.model.oauth2.OAuth2ClientRegistrationRequest;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

abstract class SimpleGrantsProcessor implements GrantProcessor {
   private static final ELogger LOG = ELoggerFactory.getLogger(SimpleGrantsProcessor.class);
   private final String grantType;

   @Override
   public Optional<OAuth2ClientRegistrationError> updateClient(OAuth2ClientRegistrationRequest request, OAuth2TechnicalClientMetadataBuilder clientBuilder) {
      if (!this.isCodeTypeRequested(request)) {
         return Optional.empty();
      }

      clientBuilder.grantType(this.grantType);
      return Optional.empty();
   }

   private boolean isCodeTypeRequested(OAuth2ClientRegistrationRequest request) {
      OAuth2ClientRegistrationMetadata metadata = request.getMetadata();
      if (metadata.grantTypes().isEmpty()) {
         LOG.debug("Enabling " + this.grantType + " grant because client specifies no grant types.");
         return true;
      } else {
         return metadata.grantTypes().contains(this.grantType);
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   protected SimpleGrantsProcessor(String grantType) {
      this.grantType = grantType;
   }
}
