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

import com.google.common.base.Preconditions;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import lombok.NonNull;

public final class HybridFlowSettings {
   private final Optional<OAuth2AccessTokenSettings> accessTokenSettings;
   private final Optional<OpenIdConnectIdTokenSettings> idTokenSettings;

   private HybridFlowSettings(@NonNull Optional<OAuth2AccessTokenSettings> accessTokenSettings, @NonNull Optional<OpenIdConnectIdTokenSettings> idTokenSettings) {
      if (accessTokenSettings == null) {
         throw new NullPointerException("accessTokenSettings is marked non-null but is null");
      }

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

      Preconditions.checkArgument(
         accessTokenSettings.isPresent() || idTokenSettings.isPresent(),
         "With hybrid flow either an access token or an ID token configuration must be present."
      );
      this.accessTokenSettings = accessTokenSettings;
      this.idTokenSettings = idTokenSettings;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public Optional<OAuth2AccessTokenSettings> getAccessTokenSettings() {
      return this.accessTokenSettings;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<OpenIdConnectIdTokenSettings> getIdTokenSettings() {
      return this.idTokenSettings;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean equals(Object o) {
      if (o == this) {
         return true;
      } else if (!(o instanceof HybridFlowSettings other)) {
         return false;
      } else {
         Object this$accessTokenSettings = this.accessTokenSettings;
         Object other$accessTokenSettings = other.accessTokenSettings;
         if (this$accessTokenSettings == null ? other$accessTokenSettings == null : this$accessTokenSettings.equals(other$accessTokenSettings)) {
            Object this$idTokenSettings = this.idTokenSettings;
            Object other$idTokenSettings = other.idTokenSettings;
            return this$idTokenSettings == null ? other$idTokenSettings == null : this$idTokenSettings.equals(other$idTokenSettings);
         } else {
            return false;
         }
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public int hashCode() {
      int PRIME = 59;
      int result = 1;
      Object $accessTokenSettings = this.accessTokenSettings;
      result = result * 59 + ($accessTokenSettings == null ? 43 : $accessTokenSettings.hashCode());
      Object $idTokenSettings = this.idTokenSettings;
      return result * 59 + ($idTokenSettings == null ? 43 : $idTokenSettings.hashCode());
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "HybridFlowSettings(accessTokenSettings=" + this.getAccessTokenSettings() + ", idTokenSettings=" + this.getIdTokenSettings() + ")";
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class HybridFlowSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OAuth2AccessTokenSettings> accessTokenSettings;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<OpenIdConnectIdTokenSettings> idTokenSettings;

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

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

         this.accessTokenSettings = accessTokenSettings;
         return this;
      }

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

         this.idTokenSettings = idTokenSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public HybridFlowSettings build() {
         return new HybridFlowSettings(this.accessTokenSettings, this.idTokenSettings);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "HybridFlowSettings.HybridFlowSettingsBuilder(accessTokenSettings="
            + this.accessTokenSettings
            + ", idTokenSettings="
            + this.idTokenSettings
            + ")";
      }
   }
}
