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

import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.application.configuration.OpenIdConnectAcrClaimConfig;
import com.airlock.iam.oauth2.application.configuration.scopepolicy.ScopePolicyConfig;
import com.airlock.iam.oauth2.domain.model.PkceCodeChallengeMethod;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import java.util.Set;
import lombok.NonNull;

public class OpenIdConnectAuthorizationCodeGrantSettings implements OAuth2OidcAuthorizationCodeGrantSettings {
   private final boolean requireRedirectUri = true;
   @NonNull
   private final ScopePolicyConfig scopePolicy;
   @NonNull
   private final Set<OAuth2Scope> alwaysGrantedScopes;
   @NonNull
   private final PkceCodeChallengeMethod pkceCodeChallengeMethod;
   private final boolean logOnInfo;
   private final boolean allowEmptyScope;
   private final int authorizationCodeExpiresIn;
   private final int idTokenExpiresIn;
   @NonNull
   private final OAuth2ApplicationFlowSelectionSettings flowSelectionSettings;
   @NonNull
   private final Optional<OpenIdConnectAcrClaimConfig> acrFlowConfig;
   @NonNull
   private final Optional<HybridFlowSettings> hybridFlowSettings;
   @NonNull
   private final OAuth2SupportedResponseModes supportedResponseModes;
   private final boolean pushedAuthorizationRequestsEnabled;
   private final boolean pushedAuthorizationRequestsRequired;

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

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean isRequireRedirectUri() {
      return true;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public ScopePolicyConfig getScopePolicy() {
      return this.scopePolicy;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Set<OAuth2Scope> getAlwaysGrantedScopes() {
      return this.alwaysGrantedScopes;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public PkceCodeChallengeMethod getPkceCodeChallengeMethod() {
      return this.pkceCodeChallengeMethod;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean isLogOnInfo() {
      return this.logOnInfo;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean isAllowEmptyScope() {
      return this.allowEmptyScope;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public int getAuthorizationCodeExpiresIn() {
      return this.authorizationCodeExpiresIn;
   }

   @SuppressFBWarnings(justification = "generated code")
   public int getIdTokenExpiresIn() {
      return this.idTokenExpiresIn;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public OAuth2ApplicationFlowSelectionSettings getFlowSelectionSettings() {
      return this.flowSelectionSettings;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public Optional<OpenIdConnectAcrClaimConfig> getAcrFlowConfig() {
      return this.acrFlowConfig;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public Optional<HybridFlowSettings> getHybridFlowSettings() {
      return this.hybridFlowSettings;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public OAuth2SupportedResponseModes getSupportedResponseModes() {
      return this.supportedResponseModes;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean isPushedAuthorizationRequestsEnabled() {
      return this.pushedAuthorizationRequestsEnabled;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean isPushedAuthorizationRequestsRequired() {
      return this.pushedAuthorizationRequestsRequired;
   }

   @SuppressFBWarnings(justification = "generated code")
   public OpenIdConnectAuthorizationCodeGrantSettings(
      @NonNull ScopePolicyConfig scopePolicy,
      @NonNull Set<OAuth2Scope> alwaysGrantedScopes,
      @NonNull PkceCodeChallengeMethod pkceCodeChallengeMethod,
      boolean logOnInfo,
      boolean allowEmptyScope,
      int authorizationCodeExpiresIn,
      int idTokenExpiresIn,
      @NonNull OAuth2ApplicationFlowSelectionSettings flowSelectionSettings,
      @NonNull Optional<OpenIdConnectAcrClaimConfig> acrFlowConfig,
      @NonNull Optional<HybridFlowSettings> hybridFlowSettings,
      @NonNull OAuth2SupportedResponseModes supportedResponseModes,
      boolean pushedAuthorizationRequestsEnabled,
      boolean pushedAuthorizationRequestsRequired
   ) {
      if (scopePolicy == null) {
         throw new NullPointerException("scopePolicy is marked non-null but is null");
      }

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

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

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

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

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

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

      this.scopePolicy = scopePolicy;
      this.alwaysGrantedScopes = alwaysGrantedScopes;
      this.pkceCodeChallengeMethod = pkceCodeChallengeMethod;
      this.logOnInfo = logOnInfo;
      this.allowEmptyScope = allowEmptyScope;
      this.authorizationCodeExpiresIn = authorizationCodeExpiresIn;
      this.idTokenExpiresIn = idTokenExpiresIn;
      this.flowSelectionSettings = flowSelectionSettings;
      this.acrFlowConfig = acrFlowConfig;
      this.hybridFlowSettings = hybridFlowSettings;
      this.supportedResponseModes = supportedResponseModes;
      this.pushedAuthorizationRequestsEnabled = pushedAuthorizationRequestsEnabled;
      this.pushedAuthorizationRequestsRequired = pushedAuthorizationRequestsRequired;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OpenIdConnectAuthorizationCodeGrantSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private ScopePolicyConfig scopePolicy;
      @SuppressFBWarnings(justification = "generated code")
      private Set<OAuth2Scope> alwaysGrantedScopes;
      @SuppressFBWarnings(justification = "generated code")
      private PkceCodeChallengeMethod pkceCodeChallengeMethod;
      @SuppressFBWarnings(justification = "generated code")
      private boolean logOnInfo;
      @SuppressFBWarnings(justification = "generated code")
      private boolean allowEmptyScope;
      @SuppressFBWarnings(justification = "generated code")
      private int authorizationCodeExpiresIn;
      @SuppressFBWarnings(justification = "generated code")
      private int idTokenExpiresIn;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ApplicationFlowSelectionSettings flowSelectionSettings;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OpenIdConnectAcrClaimConfig> acrFlowConfig;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<HybridFlowSettings> hybridFlowSettings;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2SupportedResponseModes supportedResponseModes;
      @SuppressFBWarnings(justification = "generated code")
      private boolean pushedAuthorizationRequestsEnabled;
      @SuppressFBWarnings(justification = "generated code")
      private boolean pushedAuthorizationRequestsRequired;

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

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder scopePolicy(@NonNull ScopePolicyConfig scopePolicy) {
         if (scopePolicy == null) {
            throw new NullPointerException("scopePolicy is marked non-null but is null");
         }

         this.scopePolicy = scopePolicy;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder alwaysGrantedScopes(
         @NonNull Set<OAuth2Scope> alwaysGrantedScopes
      ) {
         if (alwaysGrantedScopes == null) {
            throw new NullPointerException("alwaysGrantedScopes is marked non-null but is null");
         }

         this.alwaysGrantedScopes = alwaysGrantedScopes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder pkceCodeChallengeMethod(
         @NonNull PkceCodeChallengeMethod pkceCodeChallengeMethod
      ) {
         if (pkceCodeChallengeMethod == null) {
            throw new NullPointerException("pkceCodeChallengeMethod is marked non-null but is null");
         }

         this.pkceCodeChallengeMethod = pkceCodeChallengeMethod;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder logOnInfo(boolean logOnInfo) {
         this.logOnInfo = logOnInfo;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder allowEmptyScope(boolean allowEmptyScope) {
         this.allowEmptyScope = allowEmptyScope;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder authorizationCodeExpiresIn(
         int authorizationCodeExpiresIn
      ) {
         this.authorizationCodeExpiresIn = authorizationCodeExpiresIn;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder idTokenExpiresIn(int idTokenExpiresIn) {
         this.idTokenExpiresIn = idTokenExpiresIn;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder flowSelectionSettings(
         @NonNull OAuth2ApplicationFlowSelectionSettings flowSelectionSettings
      ) {
         if (flowSelectionSettings == null) {
            throw new NullPointerException("flowSelectionSettings is marked non-null but is null");
         }

         this.flowSelectionSettings = flowSelectionSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder acrFlowConfig(
         @NonNull Optional<OpenIdConnectAcrClaimConfig> acrFlowConfig
      ) {
         if (acrFlowConfig == null) {
            throw new NullPointerException("acrFlowConfig is marked non-null but is null");
         }

         this.acrFlowConfig = acrFlowConfig;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder hybridFlowSettings(
         @NonNull Optional<HybridFlowSettings> hybridFlowSettings
      ) {
         if (hybridFlowSettings == null) {
            throw new NullPointerException("hybridFlowSettings is marked non-null but is null");
         }

         this.hybridFlowSettings = hybridFlowSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder supportedResponseModes(
         @NonNull OAuth2SupportedResponseModes supportedResponseModes
      ) {
         if (supportedResponseModes == null) {
            throw new NullPointerException("supportedResponseModes is marked non-null but is null");
         }

         this.supportedResponseModes = supportedResponseModes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder pushedAuthorizationRequestsEnabled(
         boolean pushedAuthorizationRequestsEnabled
      ) {
         this.pushedAuthorizationRequestsEnabled = pushedAuthorizationRequestsEnabled;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder pushedAuthorizationRequestsRequired(
         boolean pushedAuthorizationRequestsRequired
      ) {
         this.pushedAuthorizationRequestsRequired = pushedAuthorizationRequestsRequired;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAuthorizationCodeGrantSettings build() {
         return new OpenIdConnectAuthorizationCodeGrantSettings(
            this.scopePolicy,
            this.alwaysGrantedScopes,
            this.pkceCodeChallengeMethod,
            this.logOnInfo,
            this.allowEmptyScope,
            this.authorizationCodeExpiresIn,
            this.idTokenExpiresIn,
            this.flowSelectionSettings,
            this.acrFlowConfig,
            this.hybridFlowSettings,
            this.supportedResponseModes,
            this.pushedAuthorizationRequestsEnabled,
            this.pushedAuthorizationRequestsRequired
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OpenIdConnectAuthorizationCodeGrantSettings.OpenIdConnectAuthorizationCodeGrantSettingsBuilder(scopePolicy="
            + this.scopePolicy
            + ", alwaysGrantedScopes="
            + this.alwaysGrantedScopes
            + ", pkceCodeChallengeMethod="
            + this.pkceCodeChallengeMethod
            + ", logOnInfo="
            + this.logOnInfo
            + ", allowEmptyScope="
            + this.allowEmptyScope
            + ", authorizationCodeExpiresIn="
            + this.authorizationCodeExpiresIn
            + ", idTokenExpiresIn="
            + this.idTokenExpiresIn
            + ", flowSelectionSettings="
            + this.flowSelectionSettings
            + ", acrFlowConfig="
            + this.acrFlowConfig
            + ", hybridFlowSettings="
            + this.hybridFlowSettings
            + ", supportedResponseModes="
            + this.supportedResponseModes
            + ", pushedAuthorizationRequestsEnabled="
            + this.pushedAuthorizationRequestsEnabled
            + ", pushedAuthorizationRequestsRequired="
            + this.pushedAuthorizationRequestsRequired
            + ")";
      }
   }
}
