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

import com.airlock.iam.login.api.domain.model.oauth2.OAuth2Credential;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public final class AccountRegistrationContextDataExtractor {
   private final String contextDataItemName;
   private final boolean optional;

   public Optional<AccountRegistrationContextData> contextData(OAuth2Credential credential) throws AccountRegistrationContextDataExtractor.MandatoryContextDataMissingException {
      Object attributeValue = credential.getAttributeValue(this.contextDataItemName);
      if (attributeValue != null) {
         return Optional.of(new AccountRegistrationContextData(this.contextDataItemName, attributeValue));
      } else if (!this.optional) {
         throw new AccountRegistrationContextDataExtractor.MandatoryContextDataMissingException(this.contextDataItemName);
      } else {
         return Optional.empty();
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   public static AccountRegistrationContextDataExtractor.AccountRegistrationContextDataExtractorBuilder builder() {
      return new AccountRegistrationContextDataExtractor.AccountRegistrationContextDataExtractorBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public AccountRegistrationContextDataExtractor(String contextDataItemName, boolean optional) {
      this.contextDataItemName = contextDataItemName;
      this.optional = optional;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class AccountRegistrationContextDataExtractorBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String contextDataItemName;
      @SuppressFBWarnings(justification = "generated code")
      private boolean optional;

      @SuppressFBWarnings(justification = "generated code")
      AccountRegistrationContextDataExtractorBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public AccountRegistrationContextDataExtractor.AccountRegistrationContextDataExtractorBuilder contextDataItemName(String contextDataItemName) {
         this.contextDataItemName = contextDataItemName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AccountRegistrationContextDataExtractor.AccountRegistrationContextDataExtractorBuilder optional(boolean optional) {
         this.optional = optional;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AccountRegistrationContextDataExtractor build() {
         return new AccountRegistrationContextDataExtractor(this.contextDataItemName, this.optional);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "AccountRegistrationContextDataExtractor.AccountRegistrationContextDataExtractorBuilder(contextDataItemName="
            + this.contextDataItemName
            + ", optional="
            + this.optional
            + ")";
      }
   }

   public static class MandatoryContextDataMissingException extends Exception {
      public MandatoryContextDataMissingException(String contextDataName) {
         super("Mandatory context data field missing: " + contextDataName);
      }
   }
}
