import * as grpc from '@grpc/grpc-js';
import { MessageTypeDefinition } from '@grpc/proto-loader';
import { AccountClient, AccountDefinition } from './accounts/Account';
import './jwk/AddJWKToClientRequest';
import './core/PublicJWK';
import './client/AuthenticateClientRequest';
import './user/AuthenticateUserRequest';
import './user/AuthenticateUserResponse';
import './core/AuthorizationServerMetadata';
import './core/Client';
import './core/JWKS';
import './authorization_code/CreateAuthorizationCodeRequest';
import './authorization_code/CreateAuthorizationCodeResponse';
import './client/CreateClientRequest';
import './jwk/CreateJWKPairResponse';
import './core/PrivateJWK';
import './token/CreateTokenRequest';
import './token/CreateTokenResponse';
import './user/CreateUserRequest';
import './core/DeleteRequest';
import './core/Empty';
import './core/GetRequest';
import './token/InvalidateTokenRequest';
import './token/InvalidateTokenResponse';
import './client/ListClientsResponse';
import './core/ListRequest';
import './scope/ListScopesResponse';
import './core/Scope';
import './client/UpdateClientRequest';
import './client/UpdateClientSecretRequest';
import './core/User';
import './core/Address';
import './core/ClientApproval';
import './core/Profile';
import './token/ValidateTokenRequest';
import './token/ValidateTokenResponse';

declare type SubtypeConstructor<Constructor extends new (...args: any) => any, Subtype> = {
    new (...args: ConstructorParameters<Constructor>): Subtype;
};
interface ProtoGrpcType {
    accounts: {
        Account: SubtypeConstructor<typeof grpc.Client, AccountClient> & {
            service: AccountDefinition;
        };
    };
    authorization_code: {
        CreateAuthorizationCodeRequest: MessageTypeDefinition;
        CreateAuthorizationCodeResponse: MessageTypeDefinition;
        InvalidateAuthorizationCodeRequest: MessageTypeDefinition;
        InvalidateAuthorizationCodeResponse: MessageTypeDefinition;
    };
    client: {
        AuthenticateClientRequest: MessageTypeDefinition;
        CreateClientRequest: MessageTypeDefinition;
        ListClientsResponse: MessageTypeDefinition;
        UpdateClientRequest: MessageTypeDefinition;
        UpdateClientSecretRequest: MessageTypeDefinition;
    };
    core: {
        Address: MessageTypeDefinition;
        AuthorizationServerMetadata: MessageTypeDefinition;
        Client: MessageTypeDefinition;
        ClientApproval: MessageTypeDefinition;
        DeleteRequest: MessageTypeDefinition;
        Empty: MessageTypeDefinition;
        GetRequest: MessageTypeDefinition;
        JWKS: MessageTypeDefinition;
        ListRequest: MessageTypeDefinition;
        PrivateJWK: MessageTypeDefinition;
        Profile: MessageTypeDefinition;
        PublicJWK: MessageTypeDefinition;
        Scope: MessageTypeDefinition;
        User: MessageTypeDefinition;
    };
    jwk: {
        AddJWKToClientRequest: MessageTypeDefinition;
        CreateJWKPairResponse: MessageTypeDefinition;
        DeleteJWKResponse: MessageTypeDefinition;
    };
    scope: {
        ListScopesResponse: MessageTypeDefinition;
    };
    token: {
        CreateTokenRequest: MessageTypeDefinition;
        CreateTokenResponse: MessageTypeDefinition;
        InvalidateTokenRequest: MessageTypeDefinition;
        InvalidateTokenResponse: MessageTypeDefinition;
        ValidateTokenRequest: MessageTypeDefinition;
        ValidateTokenResponse: MessageTypeDefinition;
    };
    user: {
        AuthenticateUserRequest: MessageTypeDefinition;
        AuthenticateUserResponse: MessageTypeDefinition;
        CreateUserRequest: MessageTypeDefinition;
    };
}

export { ProtoGrpcType };
