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

import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.domain.model.OAuth2RequestedResponseMode;
import com.airlock.iam.oauth2.domain.model.OAuth2ResponseMode;
import com.airlock.iam.oauth2.domain.model.State;
import com.airlock.iam.oauth2.domain.model.authorization.OAuth2ResponseType;
import com.airlock.iam.oauth2.domain.model.par.OAuth2ParRequestUri;
import com.airlock.iam.oauth2.domain.model.session.PkceCodeChallenge;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public interface OAuth2OidcAuthorizationRequest {
   List<OAuth2Scope> getRequestedScopes();

   OAuth2ClientId getClientId();

   Optional<OAuth2ResponseType> getResponseType();

   OAuth2ResponseMode getImpliedResponseMode();

   Optional<OAuth2RequestedResponseMode> getRequestedResponseMode();

   Optional<PkceCodeChallenge> getPkceChallenge();

   Optional<URI> getRedirectURI();

   Optional<State> getState();

   List<String> getPrompt();

   URI getAuthorizationEndpointURI();

   Optional<OAuth2ParRequestUri> getRequestURI();

   default boolean hasRequestUri() {
      return this.getRequestURI().isPresent();
   }

   URI toURI();

   Map<String, List<String>> toParameters();

   String toQueryParametersString();

   default boolean impliesPushedAuthorizationRequest() {
      return this.getRequestURI().isPresent();
   }
}
