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

import com.airlock.iam.oauth2.domain.model.codegrant.OAuth2CodeGrantSettings;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.util.Optional;
import lombok.NonNull;

public final class DefaultOAuth2GrantSettings implements OAuth2GrantSettings {
   @NonNull
   private final Optional<OAuth2CodeGrantSettings> codeGrantSettings;
   private final boolean isClientCredentialsGrantConfigured;
   private final boolean isTokenExchangeGrantConfigured;
   @NonNull
   private final OAuth2ApplicationUiSettings applicationUiSettings;
   private final boolean isIntegrationLogEnabled;

   public DefaultOAuth2GrantSettings(
      @Nullable OAuth2CodeGrantSettings codeGrantSettings,
      boolean isClientCredentialsGrantConfigured,
      boolean isTokenExchangeGrantConfigured,
      @NonNull OAuth2ApplicationUiSettings applicationUiSettings,
      boolean isIntegrationLogEnabled
   ) {
      if (applicationUiSettings == null) {
         throw new NullPointerException("applicationUiSettings is marked non-null but is null");
      }

      this.codeGrantSettings = Optional.ofNullable(codeGrantSettings);
      this.isClientCredentialsGrantConfigured = isClientCredentialsGrantConfigured;
      this.isTokenExchangeGrantConfigured = isTokenExchangeGrantConfigured;
      this.applicationUiSettings = applicationUiSettings;
      this.isIntegrationLogEnabled = isIntegrationLogEnabled;
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Optional<OAuth2CodeGrantSettings> codeGrantSettings() {
      return this.codeGrantSettings;
   }

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

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public OAuth2ApplicationUiSettings applicationUiSettings() {
      return this.applicationUiSettings;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class DefaultOAuth2GrantSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2CodeGrantSettings codeGrantSettings;
      @SuppressFBWarnings(justification = "generated code")
      private boolean isClientCredentialsGrantConfigured;
      @SuppressFBWarnings(justification = "generated code")
      private boolean isTokenExchangeGrantConfigured;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ApplicationUiSettings applicationUiSettings;
      @SuppressFBWarnings(justification = "generated code")
      private boolean isIntegrationLogEnabled;

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

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2GrantSettings.DefaultOAuth2GrantSettingsBuilder codeGrantSettings(@Nullable OAuth2CodeGrantSettings codeGrantSettings) {
         this.codeGrantSettings = codeGrantSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2GrantSettings.DefaultOAuth2GrantSettingsBuilder isClientCredentialsGrantConfigured(boolean isClientCredentialsGrantConfigured) {
         this.isClientCredentialsGrantConfigured = isClientCredentialsGrantConfigured;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2GrantSettings.DefaultOAuth2GrantSettingsBuilder isTokenExchangeGrantConfigured(boolean isTokenExchangeGrantConfigured) {
         this.isTokenExchangeGrantConfigured = isTokenExchangeGrantConfigured;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2GrantSettings.DefaultOAuth2GrantSettingsBuilder applicationUiSettings(@NonNull OAuth2ApplicationUiSettings applicationUiSettings) {
         if (applicationUiSettings == null) {
            throw new NullPointerException("applicationUiSettings is marked non-null but is null");
         }

         this.applicationUiSettings = applicationUiSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2GrantSettings.DefaultOAuth2GrantSettingsBuilder isIntegrationLogEnabled(boolean isIntegrationLogEnabled) {
         this.isIntegrationLogEnabled = isIntegrationLogEnabled;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2GrantSettings build() {
         return new DefaultOAuth2GrantSettings(
            this.codeGrantSettings,
            this.isClientCredentialsGrantConfigured,
            this.isTokenExchangeGrantConfigured,
            this.applicationUiSettings,
            this.isIntegrationLogEnabled
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "DefaultOAuth2GrantSettings.DefaultOAuth2GrantSettingsBuilder(codeGrantSettings="
            + this.codeGrantSettings
            + ", isClientCredentialsGrantConfigured="
            + this.isClientCredentialsGrantConfigured
            + ", isTokenExchangeGrantConfigured="
            + this.isTokenExchangeGrantConfigured
            + ", applicationUiSettings="
            + this.applicationUiSettings
            + ", isIntegrationLogEnabled="
            + this.isIntegrationLogEnabled
            + ")";
      }
   }
}
