import { Prettify } from "../common";
import { IndexQueryInput, QueryResultSet } from "../index-data/query-config/query-input-config";
import { RemoteJoinerOptions, RemoteJoinerQuery } from "../joiner";
import { RemoteQueryEntryPoints } from "./remote-query-entry-points";
import { RemoteQueryInput, RemoteQueryObjectConfig, RemoteQueryObjectFromStringResult } from "./remote-query-object-from-string";
export type RemoteQueryFunctionReturnPagination = {
    skip: number;
    take: number;
    count: number;
};
/**
 * The GraphResultSet presents a typed output for the
 * result returned by the underlying remote query
 */
export type GraphResultSet<TEntry extends string> = {
    data: TEntry extends keyof RemoteQueryEntryPoints ? RemoteQueryEntryPoints[TEntry][] : any[];
    metadata?: RemoteQueryFunctionReturnPagination;
};
/**
 * QueryGraphFunction is a wrapper on top of remoteQuery
 * that simplifies the input it accepts and returns
 * a normalized/consistent output.
 */
export type QueryGraphFunction = {
    <const TEntry extends string>(queryConfig: RemoteQueryInput<TEntry>, options?: RemoteJoinerOptions): Promise<Prettify<GraphResultSet<TEntry>>>;
};
/**
 * QueryIndexFunction is a wrapper on top of indexModule
 * that simplifies the input it accepts and returns
 * a normalized/consistent output.
 */
export type QueryIndexFunction = {
    <const TEntry extends string>(queryOptions: IndexQueryInput<TEntry>): Promise<Prettify<QueryResultSet<TEntry>>>;
};
export type RemoteQueryFunction = {
    /**
     * Query wrapper to provide specific API's and pre processing around remoteQuery.query
     * @param queryConfig
     * @param options
     */
    <const TEntry extends string>(queryConfig: RemoteQueryObjectConfig<TEntry>, options?: RemoteJoinerOptions): Promise<any>;
    /**
     * Query wrapper to provide specific API's and pre processing around remoteQuery.query
     * @param queryConfig
     * @param options
     */
    <const TConfig extends RemoteQueryObjectFromStringResult<any>>(queryConfig: TConfig, options?: RemoteJoinerOptions): Promise<any>;
    /**
     * Query wrapper to provide specific API's and pre processing around remoteQuery.query
     * @param query
     * @param options
     */
    (query: RemoteJoinerQuery, options?: RemoteJoinerOptions): Promise<any>;
    /**
     * Graph function uses the remoteQuery under the hood and
     * returns a result set
     */
    graph: QueryGraphFunction;
    /**
     * Index function uses the index module to query and remoteQuery to hydrate the data
     * returns a result set
     */
    index: QueryIndexFunction;
    /**
     * Query wrapper to provide specific GraphQL like API around remoteQuery.query
     * @param query
     * @param variables
     * @param options
     */
    gql: (query: string, variables?: Record<string, unknown>, options?: RemoteJoinerOptions) => Promise<any>;
};
export interface Query {
    /**
     * Query wrapper to provide specific API's and pre processing around remoteQuery.query
     * @param queryConfig
     * @param options
     */
    query<const TEntry extends string>(queryConfig: RemoteQueryObjectConfig<TEntry>, options?: RemoteJoinerOptions): Promise<any>;
    /**
     * Query wrapper to provide specific API's and pre processing around remoteQuery.query
     * @param queryConfig
     * @param options
     */
    query<const TConfig extends RemoteQueryObjectFromStringResult<any>>(queryConfig: TConfig, options?: RemoteJoinerOptions): Promise<any>;
    /**
     * Query wrapper to provide specific API's and pre processing around remoteQuery.query
     * @param query
     * @param options
     */
    query(query: RemoteJoinerQuery, options?: RemoteJoinerOptions): Promise<any>;
    /**
     * Graph function uses the remoteQuery under the hood and
     * returns a result set
     */
    graph: QueryGraphFunction;
    /**
     * Query wrapper to provide specific GraphQL like API around remoteQuery.query
     * @param query
     * @param variables
     * @param options
     */
    gql: (query: string, variables?: Record<string, unknown>, options?: RemoteJoinerOptions) => Promise<any>;
}
//# sourceMappingURL=remote-query.d.ts.map