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

import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
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.Set;
import lombok.NonNull;

public final class OAuth2AuthorizationCodeGrantSettings implements OAuth2OidcAuthorizationCodeGrantSettings {
   private final boolean requireRedirectUri;
   private final ScopePolicyConfig scopePolicy;
   @NonNull
   private final Set<OAuth2Scope> alwaysGrantedScopes;
   private final PkceCodeChallengeMethod pkceCodeChallengeMethod;
   private final boolean logOnInfo;
   private final boolean allowEmptyScope;
   private final int authorizationCodeExpiresIn;
   private final int accessTokenExpiresIn;
   private final OAuth2ApplicationFlowSelectionSettings flowSelectionSettings;
   private final boolean pushedAuthorizationRequestsEnabled;
   private final boolean pushedAuthorizationRequestsRequired;

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

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

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

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

   @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 getAccessTokenExpiresIn() {
      return this.accessTokenExpiresIn;
   }

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

   @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 OAuth2AuthorizationCodeGrantSettings(
      boolean requireRedirectUri,
      ScopePolicyConfig scopePolicy,
      @NonNull Set<OAuth2Scope> alwaysGrantedScopes,
      PkceCodeChallengeMethod pkceCodeChallengeMethod,
      boolean logOnInfo,
      boolean allowEmptyScope,
      int authorizationCodeExpiresIn,
      int accessTokenExpiresIn,
      OAuth2ApplicationFlowSelectionSettings flowSelectionSettings,
      boolean pushedAuthorizationRequestsEnabled,
      boolean pushedAuthorizationRequestsRequired
   ) {
      if (alwaysGrantedScopes == null) {
         throw new NullPointerException("alwaysGrantedScopes is marked non-null but is null");
      }

      this.requireRedirectUri = requireRedirectUri;
      this.scopePolicy = scopePolicy;
      this.alwaysGrantedScopes = alwaysGrantedScopes;
      this.pkceCodeChallengeMethod = pkceCodeChallengeMethod;
      this.logOnInfo = logOnInfo;
      this.allowEmptyScope = allowEmptyScope;
      this.authorizationCodeExpiresIn = authorizationCodeExpiresIn;
      this.accessTokenExpiresIn = accessTokenExpiresIn;
      this.flowSelectionSettings = flowSelectionSettings;
      this.pushedAuthorizationRequestsEnabled = pushedAuthorizationRequestsEnabled;
      this.pushedAuthorizationRequestsRequired = pushedAuthorizationRequestsRequired;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2AuthorizationCodeGrantSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private boolean requireRedirectUri;
      @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 accessTokenExpiresIn;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ApplicationFlowSelectionSettings flowSelectionSettings;
      @SuppressFBWarnings(justification = "generated code")
      private boolean pushedAuthorizationRequestsEnabled;
      @SuppressFBWarnings(justification = "generated code")
      private boolean pushedAuthorizationRequestsRequired;

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantSettings.OAuth2AuthorizationCodeGrantSettingsBuilder requireRedirectUri(boolean requireRedirectUri) {
         this.requireRedirectUri = requireRedirectUri;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantSettings.OAuth2AuthorizationCodeGrantSettingsBuilder scopePolicy(ScopePolicyConfig scopePolicy) {
         this.scopePolicy = scopePolicy;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantSettings.OAuth2AuthorizationCodeGrantSettingsBuilder 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 OAuth2AuthorizationCodeGrantSettings.OAuth2AuthorizationCodeGrantSettingsBuilder pkceCodeChallengeMethod(
         PkceCodeChallengeMethod pkceCodeChallengeMethod
      ) {
         this.pkceCodeChallengeMethod = pkceCodeChallengeMethod;
         return this;
      }

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

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

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantSettings.OAuth2AuthorizationCodeGrantSettingsBuilder accessTokenExpiresIn(int accessTokenExpiresIn) {
         this.accessTokenExpiresIn = accessTokenExpiresIn;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantSettings.OAuth2AuthorizationCodeGrantSettingsBuilder flowSelectionSettings(
         OAuth2ApplicationFlowSelectionSettings flowSelectionSettings
      ) {
         this.flowSelectionSettings = flowSelectionSettings;
         return this;
      }

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

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantSettings build() {
         return new OAuth2AuthorizationCodeGrantSettings(
            this.requireRedirectUri,
            this.scopePolicy,
            this.alwaysGrantedScopes,
            this.pkceCodeChallengeMethod,
            this.logOnInfo,
            this.allowEmptyScope,
            this.authorizationCodeExpiresIn,
            this.accessTokenExpiresIn,
            this.flowSelectionSettings,
            this.pushedAuthorizationRequestsEnabled,
            this.pushedAuthorizationRequestsRequired
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2AuthorizationCodeGrantSettings.OAuth2AuthorizationCodeGrantSettingsBuilder(requireRedirectUri="
            + this.requireRedirectUri
            + ", scopePolicy="
            + this.scopePolicy
            + ", alwaysGrantedScopes="
            + this.alwaysGrantedScopes
            + ", pkceCodeChallengeMethod="
            + this.pkceCodeChallengeMethod
            + ", logOnInfo="
            + this.logOnInfo
            + ", allowEmptyScope="
            + this.allowEmptyScope
            + ", authorizationCodeExpiresIn="
            + this.authorizationCodeExpiresIn
            + ", accessTokenExpiresIn="
            + this.accessTokenExpiresIn
            + ", flowSelectionSettings="
            + this.flowSelectionSettings
            + ", pushedAuthorizationRequestsEnabled="
            + this.pushedAuthorizationRequestsEnabled
            + ", pushedAuthorizationRequestsRequired="
            + this.pushedAuthorizationRequestsRequired
            + ")";
      }
   }
}
