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

import com.airlock.iam.oauth2.domain.model.settings.OAuth2ParSettings;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import lombok.NonNull;

public final class DefaultOAuth2CodeGrantSettings implements OAuth2CodeGrantSettings {
   @NonNull
   private final Optional<OAuth2CodeGrantRequestParserSettings> oauthParserSettings;
   @NonNull
   private final Optional<OpenIDConnectCodeGrantRequestParserSettings> oidcParserSettings;
   @NonNull
   private final Optional<OAuth2ParSettings> parSettings;

   @Override
   public Optional<OAuth2CodeGrantRequestParserSettings> oauthRequestParserSettings() {
      return this.oauthParserSettings;
   }

   @Override
   public Optional<OpenIDConnectCodeGrantRequestParserSettings> oidcRequestParserSettings() {
      return this.oidcParserSettings;
   }

   @Override
   public Optional<OAuth2ParSettings> parSettings() {
      return this.parSettings;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   private DefaultOAuth2CodeGrantSettings(
      @NonNull Optional<OAuth2CodeGrantRequestParserSettings> oauthParserSettings,
      @NonNull Optional<OpenIDConnectCodeGrantRequestParserSettings> oidcParserSettings,
      @NonNull Optional<OAuth2ParSettings> parSettings
   ) {
      if (oauthParserSettings == null) {
         throw new NullPointerException("oauthParserSettings is marked non-null but is null");
      }

      if (oidcParserSettings == null) {
         throw new NullPointerException("oidcParserSettings is marked non-null but is null");
      }

      if (parSettings == null) {
         throw new NullPointerException("parSettings is marked non-null but is null");
      }

      this.oauthParserSettings = oauthParserSettings;
      this.oidcParserSettings = oidcParserSettings;
      this.parSettings = parSettings;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class DefaultOAuth2CodeGrantSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OAuth2CodeGrantRequestParserSettings> oauthParserSettings;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OpenIDConnectCodeGrantRequestParserSettings> oidcParserSettings;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OAuth2ParSettings> parSettings;

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

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2CodeGrantSettings.DefaultOAuth2CodeGrantSettingsBuilder oauthParserSettings(
         @NonNull Optional<OAuth2CodeGrantRequestParserSettings> oauthParserSettings
      ) {
         if (oauthParserSettings == null) {
            throw new NullPointerException("oauthParserSettings is marked non-null but is null");
         }

         this.oauthParserSettings = oauthParserSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2CodeGrantSettings.DefaultOAuth2CodeGrantSettingsBuilder oidcParserSettings(
         @NonNull Optional<OpenIDConnectCodeGrantRequestParserSettings> oidcParserSettings
      ) {
         if (oidcParserSettings == null) {
            throw new NullPointerException("oidcParserSettings is marked non-null but is null");
         }

         this.oidcParserSettings = oidcParserSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2CodeGrantSettings.DefaultOAuth2CodeGrantSettingsBuilder parSettings(@NonNull Optional<OAuth2ParSettings> parSettings) {
         if (parSettings == null) {
            throw new NullPointerException("parSettings is marked non-null but is null");
         }

         this.parSettings = parSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2CodeGrantSettings build() {
         return new DefaultOAuth2CodeGrantSettings(this.oauthParserSettings, this.oidcParserSettings, this.parSettings);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "DefaultOAuth2CodeGrantSettings.DefaultOAuth2CodeGrantSettingsBuilder(oauthParserSettings="
            + this.oauthParserSettings
            + ", oidcParserSettings="
            + this.oidcParserSettings
            + ", parSettings="
            + this.parSettings
            + ")";
      }
   }
}
