package com.airlock.iam.oauth2.application.configuration;

import com.airlock.iam.core.misc.persistency.token.TokenDataProvider;
import com.airlock.iam.core.misc.util.password.hash.RawPasswordHash;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.oauth2.api.application.configuration.claims.OAuth2UsernameTransformer;
import com.airlock.iam.oauth2.api.application.configuration.clientauthentication.OAuth2ClientAuthenticationConfig;
import com.airlock.iam.oauth2.api.domain.model.AuthorizationServerId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OpenIdConnectSessionManagementSettings;
import com.airlock.iam.oauth2.api.domain.model.claims.UserClaimExtractor;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.ClientAuthenticationMethod;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2ClientAuthenticationPayload;
import com.airlock.iam.oauth2.api.domain.service.roles.RoleTransformationProvider;
import com.airlock.iam.oauth2.application.configuration.consentstorage.OAuth2ConsentStorageConfig;
import com.airlock.iam.oauth2.application.configuration.introspection.TokenIntrospectionSettings;
import com.airlock.iam.oauth2.application.configuration.resource.OAuth2ResourceEndpointConfig;
import com.airlock.iam.oauth2.application.configuration.session.OAuth2SessionManagementEndpointConfig;
import com.airlock.iam.oauth2.application.configuration.session.OAuth2SessionRepositoryConfig;
import com.airlock.iam.oauth2.application.configuration.token.OAuth2TokenEndpointGrantedScopeProcessorConfig;
import com.airlock.iam.oauth2.application.configuration.tokenexchange.OAuth2TokenExchangeGrantConfig;
import com.airlock.iam.oauth2.application.service.revocation.OAuth2TokenRevocationService;
import com.airlock.iam.oauth2.application.service.revocation.OAuth2TokenRevocationSettings;
import com.airlock.iam.oauth2.application.service.userinfo.OpenIDConnectUserInfoService;
import com.airlock.iam.oauth2.domain.model.Issuer;
import com.airlock.iam.oauth2.domain.model.client.OAuth2ClientLoader;
import com.airlock.iam.oauth2.domain.model.jwks.JWKSSettings;
import com.airlock.iam.oauth2.domain.model.logging.OAuth2TokenRepresentation;
import com.airlock.iam.oauth2.domain.model.logoutaction.BackchannelLogoutSettings;
import com.airlock.iam.oauth2.domain.model.metadata.OAuth2MetadataSettings;
import com.airlock.iam.oauth2.domain.model.metadata.UILocale;
import com.airlock.iam.oauth2.domain.model.settings.HybridFlowSettings;
import com.airlock.iam.oauth2.domain.model.settings.OAuth2AccessTokenSettings;
import com.airlock.iam.oauth2.domain.model.settings.OAuth2AuthorizationCodeGrantSettings;
import com.airlock.iam.oauth2.domain.model.settings.OAuth2SessionManagementSettings;
import com.airlock.iam.oauth2.domain.model.settings.OpenIdConnectAuthorizationCodeGrantSettings;
import com.airlock.iam.oauth2.domain.model.settings.OpenIdConnectIdTokenSettings;
import com.airlock.iam.oauth2.domain.model.token.OAuth2ClientAccessTokenExtensionProvider;
import com.airlock.iam.oauth2.domain.model.token.OAuth2StaticClientSettingsProvider;
import com.airlock.iam.oauth2.domain.service.clientauthentication.OAuth2TokenRevocationClientAuthenticationService;
import com.airlock.iam.oauth2.domain.service.codegrant.OAuth2CodeGrantTokenManager;
import com.airlock.iam.oauth2.domain.service.codegrant.OpenIDConnectCodeGrantTokenManager;
import com.airlock.iam.oauth2.domain.service.persistence.OAuth2UserLoader;
import com.airlock.iam.oauth2.domain.service.reporting.OAuth2ReportingService;
import com.airlock.iam.oauth2.domain.service.token.OAuth2LoginTokenService;
import com.airlock.iam.oauth2.domain.service.token.OAuth2RandomTokenGenerator;
import com.airlock.iam.oauth2.domain.service.token.OAuth2TokenBindingVerifier;
import com.airlock.iam.oauth2.domain.service.token.OAuth2TokenDeletionStrategy;
import com.airlock.iam.techclient.domain.model.TechClientRepositorySettings;
import java.util.List;
import java.util.Optional;

public interface OAuth2AuthorizationServerConfigSpec {
   AuthorizationServerId getOAuth2ASIdentifier();

   Optional<OAuth2ResourceEndpointConfig> getOAuth2ResourceEndpointConfig();

   Optional<OAuth2SessionRepositoryConfig> getSessionRepositoryConfig();

   Optional<OAuth2ConsentStorageConfig> getConsentStorageConfig();

   Optional<OAuth2ClientRegistrationConfig> getDynamicClientRegistration();

   Optional<TechClientRepositorySettings> getRepositorySettings();

   Optional<OAuth2SessionManagementEndpointConfig> getOAuth2SessionManagementEndpointConfig();

   Optional<OAuth2SessionManagementSettings> getSessionManagementSettings();

   OAuth2ClientLoader getClientLoader();

   Optional<TokenIntrospectionSettings> getTokenIntrospectionSettings();

   Optional<OAuth2TokenRevocationSettings> getTokenRevocationSettings(OAuth2ReportingService var1);

   OAuth2UserLoader getUserLoader();

   Optional<Issuer> getIssuerId();

   OAuth2TokenRepresentation tokenRepresentation();

   Optional<OpenIDConnectUserInfoService> openIdConnectUserInfoService(OAuth2ReportingService var1);

   boolean isOpenIdConnectUserInfoEndpointEnabled();

   JWKSSettings jwksSettings();

   Optional<OAuth2MetadataSettings> getMetadataEndpointSettings(OAuth2ReportingService var1, List<UILocale> var2, List<ClientAuthenticationMethod> var3);

   Optional<OAuth2MetadataSettings> openIdConnectDiscoverySettings(OAuth2ReportingService var1, List<UILocale> var2, List<ClientAuthenticationMethod> var3);

   OAuth2LoginTokenService loginTokenService();

   OAuth2UsernameTransformer getUsernameTransformer();

   RoleTransformationProvider getRoleTransformationProvider();

   Optional<OpenIdConnectSessionManagementSettings> getOpenIDConnectSessionManagement();

   Optional<OAuth2AuthorizationCodeGrantSettings> getOAuth2CodeGrantSettings();

   Optional<OpenIdConnectAuthorizationCodeGrantSettings> getOidcCodeGrantSettings();

   Optional<OAuth2TokenExchangeGrantConfig> getTokenExchangeGrantConfig();

   Optional<OpenIdConnectLoginHintFlowConfig> getLoginHintFlowConfig();

   Optional<OAuth2ScopesSettingsConfig> getScopesSettingsConfig();

   Optional<OAuth2ConsentConfig> getConsentConfig();

   Optional<OAuth2ScopeTranslatorSpec> getScopeTranslator();

   OAuth2RandomTokenGenerator getRandomTokenGenerator();

   RawPasswordHash getTokenHash();

   TokenDataProvider getTokenDataProvider();

   OAuth2TokenBindingVerifier getTokenBindingVerifier();

   ELogger getIntegrationLogger(Class<?> var1);

   boolean isIntegrationLogEnabled();

   OAuth2TokenDeletionStrategy getTokenDeletionStrategyOnLogout();

   boolean isDeleteTokensOnPasswordChange();

   boolean isDeleteTokensOnUserLocked();

   OAuth2ClientAuthenticationConfig getTokenEndpointClientAuthentication();

   Optional<OpenIdConnectIdTokenSettings> getIdTokenSettings();

   Optional<OAuth2AccessTokenSettings> getAccessTokenSettings();

   Optional<HybridFlowSettings> getHybridFlowSettings();

   Optional<OAuth2CodeGrantTokenManager> getOAuth2CodeGrantTokenManager(List<UserClaimExtractor<?>> var1, OAuth2ClientAccessTokenExtensionProvider var2);

   Optional<OpenIDConnectCodeGrantTokenManager> getOidcCodeGrantTokenManager(List<UserClaimExtractor<?>> var1, OAuth2ClientAccessTokenExtensionProvider var2);

   Optional<List<OAuth2TokenEndpointGrantedScopeProcessorConfig>> getGrantedScopeProcessors();

   Optional<OAuth2ClientCredentialsGrantConfig> getOAuth2ClientCredentialsGrantConfig();

   boolean isBindAccessTokens();

   Optional<OAuth2TokenRevocationService> getTokenRevocationService();

   Optional<OAuth2TokenRevocationClientAuthenticationService<OAuth2ClientAuthenticationPayload>> getTokenRevocationAuthenticationService(
      OAuth2ReportingService var1
   );

   Optional<BackchannelLogoutSettings> getBackchannelLogoutSettings(OAuth2ClientId var1);

   boolean isPersistClaimsInDatabase();

   OAuth2StaticClientSettingsProvider getStaticClientSettingsProvider();

   Optional<String> getCacheControlResponseHeader();
}
