import type { It } from "../../../../common/Iterable";
import type { Maybe } from "../../../../common/Maybe";
import type { ConnectionData } from "../../../Connections";
import type { ApiAuthorizerConnectionType } from "../../../Connections/ApiAuthorizerConnection";
import type { ApiEndpointType, ApiProxyEndpointType, ApiType, ResourceByType, ResourceId } from "../../../Resources";
import type { WebSocketApiType } from "../../../Resources/WebApi/WebSocket/WebSocketApi";
import type { WebSocketRouteType } from "../../../Resources/WebApi/WebSocket/WebSocketRoute";
import type { BlueprintHelper } from "../../BlueprintHelper";
import type { ConnectionHelper } from "../../ConnectionHelper";
import type { ResourceHelper } from "../../ResourceHelper";
declare type WebApiType = ApiType | WebSocketApiType;
declare type WebEndpointType = ApiEndpointType | ApiProxyEndpointType | WebSocketRouteType;
export interface GetWebApiResourceUtilsParams<ApiType extends WebApiType, EndPointType extends WebEndpointType> {
    blueprint: BlueprintHelper;
    api: ResourceHelper<ApiType>;
    endpointTypes: EndPointType[];
    endpointsValidation: (blueprint: BlueprintHelper, api: ResourceHelper<ApiType>, apiEndpoints: () => It<ResourceByType[EndPointType]>) => void;
}
export declare function getWebApiResourceUtils<ApiType extends WebApiType, EndPointType extends WebEndpointType>({ blueprint, api, endpointTypes, endpointsValidation, }: GetWebApiResourceUtilsParams<ApiType, EndPointType>): WebApiResourceUtilsBase<EndPointType>;
export interface WebApiResourceUtilsBase<EndpointType extends WebEndpointType> {
    validateEndpoint(): void;
    getEndpoints(): It<ResourceHelper<EndpointType>>;
    removeWithEndpoints(): void;
    addEndpoint(endpoint: ResourceByType[EndpointType] | ResourceHelper<EndpointType>): ResourceHelper<EndpointType>;
    /**
     * Update the default authorizer:
     *		If the current default authorizer is undefined, or if it is no longer connected
     *			set it to the first connected authorizers
     *		Otherwise, leave it as it is
     */
    updateDefaultAuthorizer(): void;
    /**
     * Creates connection to the authorizer and calls `updateDefaultAuthorizer`
     * @param targetId The target to connect
     * @param connData Optional connection data
     */
    connectAuthorizer(targetId: ResourceId, connData?: ConnectionData<ApiAuthorizerConnectionType>): ConnectionHelper<ApiAuthorizerConnectionType>;
    /**
     * Removed the connection, call `updateDefaultAuthorizer`, and set the authorizer of all
     * dependent endpoints to the default-authorizer
     * @param connection The connection to disconnect
     */
    disconnectAuthorizer(connection: Maybe<ConnectionHelper<ApiAuthorizerConnectionType>>): void;
    /**
     * Gets the default authorizer connection
     */
    getDefaultAuthorizer(): Maybe<ConnectionHelper<ApiAuthorizerConnectionType>>;
}
export declare function getWebApiEndpointUtils<ApiType extends WebApiType, EndPointType extends WebEndpointType>(blueprint: BlueprintHelper, apiEndpoint: ResourceHelper<EndPointType>, apiType: ApiType): WebApiEndpointUtilsBase<ApiType>;
export interface WebApiEndpointUtilsBase<ApiType extends WebApiType> {
    removeEndpoint(): void;
    getApi(): ResourceHelper<ApiType>;
    registerOnApi(): void;
    /**
     * Get the authorizer (or the default authorizer) connection
     */
    getAuthorizer(): Maybe<ConnectionHelper<ApiAuthorizerConnectionType>>;
}
export {};
