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

import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.domain.model.OAuth2RequestedResponseMode;
import com.airlock.iam.oauth2.domain.model.State;
import com.airlock.iam.oauth2.domain.model.validation.OAuth2Error;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.net.URI;
import java.util.Optional;

public final class OAuth2AuthorizationCodeGrantRequestParseException extends Exception {
   private final Optional<OAuth2Error> error;
   private final Optional<String> errorDescription;
   private final Optional<OAuth2ClientId> clientId;
   private final Optional<URI> redirectUri;
   private final Optional<OAuth2RequestedResponseMode> responseMode;
   private final Optional<State> state;

   public OAuth2AuthorizationCodeGrantRequestParseException(String message) {
      super(message);
      this.error = Optional.empty();
      this.errorDescription = Optional.empty();
      this.clientId = Optional.empty();
      this.redirectUri = Optional.empty();
      this.responseMode = Optional.empty();
      this.state = Optional.empty();
   }

   private OAuth2AuthorizationCodeGrantRequestParseException(
      String message,
      @Nullable OAuth2Error error,
      @Nullable String errorDescription,
      @Nullable OAuth2ClientId clientId,
      @Nullable URI redirectUri,
      @Nullable OAuth2RequestedResponseMode responseMode,
      @Nullable State state
   ) {
      super(message);
      this.error = Optional.ofNullable(error);
      this.errorDescription = Optional.ofNullable(errorDescription);
      this.clientId = Optional.ofNullable(clientId);
      this.redirectUri = Optional.ofNullable(redirectUri);
      this.responseMode = Optional.ofNullable(responseMode);
      this.state = Optional.ofNullable(state);
   }

   public Optional<State> getState() {
      return this.state;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public Optional<OAuth2Error> getError() {
      return this.error;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public Optional<OAuth2ClientId> getClientId() {
      return this.clientId;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<URI> getRedirectUri() {
      return this.redirectUri;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<OAuth2RequestedResponseMode> getResponseMode() {
      return this.responseMode;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2AuthorizationCodeGrantRequestParseExceptionBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String message;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2Error error;
      @SuppressFBWarnings(justification = "generated code")
      private String errorDescription;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ClientId clientId;
      @SuppressFBWarnings(justification = "generated code")
      private URI redirectUri;
      @SuppressFBWarnings(justification = "generated code")
      private OAuth2RequestedResponseMode responseMode;
      @SuppressFBWarnings(justification = "generated code")
      private State state;

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantRequestParseException.OAuth2AuthorizationCodeGrantRequestParseExceptionBuilder message(String message) {
         this.message = message;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantRequestParseException.OAuth2AuthorizationCodeGrantRequestParseExceptionBuilder error(@Nullable OAuth2Error error) {
         this.error = error;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantRequestParseException.OAuth2AuthorizationCodeGrantRequestParseExceptionBuilder errorDescription(
         @Nullable String errorDescription
      ) {
         this.errorDescription = errorDescription;
         return this;
      }

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

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantRequestParseException.OAuth2AuthorizationCodeGrantRequestParseExceptionBuilder responseMode(
         @Nullable OAuth2RequestedResponseMode responseMode
      ) {
         this.responseMode = responseMode;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantRequestParseException.OAuth2AuthorizationCodeGrantRequestParseExceptionBuilder state(@Nullable State state) {
         this.state = state;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2AuthorizationCodeGrantRequestParseException build() {
         return new OAuth2AuthorizationCodeGrantRequestParseException(
            this.message, this.error, this.errorDescription, this.clientId, this.redirectUri, this.responseMode, this.state
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2AuthorizationCodeGrantRequestParseException.OAuth2AuthorizationCodeGrantRequestParseExceptionBuilder(message="
            + this.message
            + ", error="
            + this.error
            + ", errorDescription="
            + this.errorDescription
            + ", clientId="
            + this.clientId
            + ", redirectUri="
            + this.redirectUri
            + ", responseMode="
            + this.responseMode
            + ", state="
            + this.state
            + ")";
      }
   }
}
