package com.airlock.iam.oauth2.domain.model.client.communication;

import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.domain.model.client.AudienceClaimValidationMethod;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
import lombok.NonNull;

public class OpenIDConnectClientParserSettings {
   @NonNull
   private final OAuth2ClientId clientId;
   @NonNull
   private final URI redirectUri;
   @NonNull
   private final Supplier<URI> authorizationEndpointUri;
   @NonNull
   private final Optional<String> customIssuerClaim;
   @NonNull
   private final AudienceClaimValidationMethod audienceClaimValidationMethod;
   @NonNull
   private final Optional<String> customAudienceClaim;
   @NonNull
   private final List<String> acrValuesClaim;
   private final boolean enableAcrValidation;
   @NonNull
   private final List<ClaimRequestSettings> claimRequestSettings;
   private final boolean includeNonce;
   private final Map<String, Supplier<String>> customParameters;

   @SuppressFBWarnings(justification = "generated code")
   OpenIDConnectClientParserSettings(
      @NonNull OAuth2ClientId clientId,
      @NonNull URI redirectUri,
      @NonNull Supplier<URI> authorizationEndpointUri,
      @NonNull Optional<String> customIssuerClaim,
      @NonNull AudienceClaimValidationMethod audienceClaimValidationMethod,
      @NonNull Optional<String> customAudienceClaim,
      @NonNull List<String> acrValuesClaim,
      boolean enableAcrValidation,
      @NonNull List<ClaimRequestSettings> claimRequestSettings,
      boolean includeNonce,
      Map<String, Supplier<String>> customParameters
   ) {
      if (clientId == null) {
         throw new NullPointerException("clientId is marked non-null but is null");
      }

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

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

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

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

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

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

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

      this.clientId = clientId;
      this.redirectUri = redirectUri;
      this.authorizationEndpointUri = authorizationEndpointUri;
      this.customIssuerClaim = customIssuerClaim;
      this.audienceClaimValidationMethod = audienceClaimValidationMethod;
      this.customAudienceClaim = customAudienceClaim;
      this.acrValuesClaim = acrValuesClaim;
      this.enableAcrValidation = enableAcrValidation;
      this.claimRequestSettings = claimRequestSettings;
      this.includeNonce = includeNonce;
      this.customParameters = customParameters;
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public OAuth2ClientId clientId() {
      return this.clientId;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public URI redirectUri() {
      return this.redirectUri;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public Supplier<URI> authorizationEndpointUri() {
      return this.authorizationEndpointUri;
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public AudienceClaimValidationMethod audienceClaimValidationMethod() {
      return this.audienceClaimValidationMethod;
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public List<String> acrValuesClaim() {
      return this.acrValuesClaim;
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public List<ClaimRequestSettings> claimRequestSettings() {
      return this.claimRequestSettings;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public Map<String, Supplier<String>> customParameters() {
      return this.customParameters;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OpenIDConnectClientParserSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ClientId clientId;
      @SuppressFBWarnings(justification = "generated code")
      private URI redirectUri;
      @SuppressFBWarnings(justification = "generated code")
      private Supplier<URI> authorizationEndpointUri;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<String> customIssuerClaim;
      @SuppressFBWarnings(justification = "generated code")
      private AudienceClaimValidationMethod audienceClaimValidationMethod;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<String> customAudienceClaim;
      @SuppressFBWarnings(justification = "generated code")
      private List<String> acrValuesClaim;
      @SuppressFBWarnings(justification = "generated code")
      private boolean enableAcrValidation;
      @SuppressFBWarnings(justification = "generated code")
      private List<ClaimRequestSettings> claimRequestSettings;
      @SuppressFBWarnings(justification = "generated code")
      private boolean includeNonce;
      @SuppressFBWarnings(justification = "generated code")
      private Map<String, Supplier<String>> customParameters;

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

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder clientId(@NonNull OAuth2ClientId clientId) {
         if (clientId == null) {
            throw new NullPointerException("clientId is marked non-null but is null");
         }

         this.clientId = clientId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder redirectUri(@NonNull URI redirectUri) {
         if (redirectUri == null) {
            throw new NullPointerException("redirectUri is marked non-null but is null");
         }

         this.redirectUri = redirectUri;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder authorizationEndpointUri(
         @NonNull Supplier<URI> authorizationEndpointUri
      ) {
         if (authorizationEndpointUri == null) {
            throw new NullPointerException("authorizationEndpointUri is marked non-null but is null");
         }

         this.authorizationEndpointUri = authorizationEndpointUri;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder customIssuerClaim(@NonNull Optional<String> customIssuerClaim) {
         if (customIssuerClaim == null) {
            throw new NullPointerException("customIssuerClaim is marked non-null but is null");
         }

         this.customIssuerClaim = customIssuerClaim;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder audienceClaimValidationMethod(
         @NonNull AudienceClaimValidationMethod audienceClaimValidationMethod
      ) {
         if (audienceClaimValidationMethod == null) {
            throw new NullPointerException("audienceClaimValidationMethod is marked non-null but is null");
         }

         this.audienceClaimValidationMethod = audienceClaimValidationMethod;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder customAudienceClaim(@NonNull Optional<String> customAudienceClaim) {
         if (customAudienceClaim == null) {
            throw new NullPointerException("customAudienceClaim is marked non-null but is null");
         }

         this.customAudienceClaim = customAudienceClaim;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder acrValuesClaim(@NonNull List<String> acrValuesClaim) {
         if (acrValuesClaim == null) {
            throw new NullPointerException("acrValuesClaim is marked non-null but is null");
         }

         this.acrValuesClaim = acrValuesClaim;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder enableAcrValidation(boolean enableAcrValidation) {
         this.enableAcrValidation = enableAcrValidation;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder claimRequestSettings(
         @NonNull List<ClaimRequestSettings> claimRequestSettings
      ) {
         if (claimRequestSettings == null) {
            throw new NullPointerException("claimRequestSettings is marked non-null but is null");
         }

         this.claimRequestSettings = claimRequestSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder includeNonce(boolean includeNonce) {
         this.includeNonce = includeNonce;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder customParameters(Map<String, Supplier<String>> customParameters) {
         this.customParameters = customParameters;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIDConnectClientParserSettings build() {
         return new OpenIDConnectClientParserSettings(
            this.clientId,
            this.redirectUri,
            this.authorizationEndpointUri,
            this.customIssuerClaim,
            this.audienceClaimValidationMethod,
            this.customAudienceClaim,
            this.acrValuesClaim,
            this.enableAcrValidation,
            this.claimRequestSettings,
            this.includeNonce,
            this.customParameters
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OpenIDConnectClientParserSettings.OpenIDConnectClientParserSettingsBuilder(clientId="
            + this.clientId
            + ", redirectUri="
            + this.redirectUri
            + ", authorizationEndpointUri="
            + this.authorizationEndpointUri
            + ", customIssuerClaim="
            + this.customIssuerClaim
            + ", audienceClaimValidationMethod="
            + this.audienceClaimValidationMethod
            + ", customAudienceClaim="
            + this.customAudienceClaim
            + ", acrValuesClaim="
            + this.acrValuesClaim
            + ", enableAcrValidation="
            + this.enableAcrValidation
            + ", claimRequestSettings="
            + this.claimRequestSettings
            + ", includeNonce="
            + this.includeNonce
            + ", customParameters="
            + this.customParameters
            + ")";
      }
   }
}
