import type { QraftServiceOperationsToken } from '@openapi-qraft/tanstack-query-react-types';
import type { QueryClient } from '@tanstack/react-query';
import type * as callbacks from './callbacks/index.js';
import type * as operationInvokeModule from './callbacks/operationInvokeFn.js';
import type { OperationSchema, RequestFnInfo, RequestFnResponse } from './lib/requestFn.js';
export interface CreateAPIBasicClientOptions {
    requestFn: (schema: OperationSchema, requestInfo: RequestFnInfo) => Promise<RequestFnResponse<any, any>>;
    baseUrl: string;
}
export interface CreateAPIBasicQueryClientOptions {
    queryClient: QueryClient;
}
export interface CreateAPIQueryClientOptions extends CreateAPIBasicClientOptions, CreateAPIBasicQueryClientOptions {
}
/**
 * @deprecated use `CreateAPIClientOptions` instead
 */
export type QraftClientOptions = CreateAPIBasicClientOptions | CreateAPIQueryClientOptions;
export type CreateAPIClientOptions = CreateAPIBasicClientOptions | CreateAPIBasicQueryClientOptions | CreateAPIQueryClientOptions;
/**
 * Creates a QueryClient compatible API Client which contains all operations
 * such as `useQuery`, `useMutation`.
 *
 * @example Fetching data with QueryClient
 * ```ts
 * const api = qraftAPIClient(services, callbacks, {
 *   requestFn: requestFn,
 *   baseUrl: 'https://api.example.com',
 *   queryClient: new QueryClient(),
 * });
 *
 * api.service.operation({
 *   parameters: { path: { id: 1 } },
 * });
 * ```
 */
export declare function qraftAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends ServiceMethods>(services: Services, callbacks: Callbacks, options: CreateAPIQueryClientOptions): APIDefaultQueryClientServices<Services>;
/**
 * Creates a QueryClient compatible API Client which contains all operations
 * such as `useQuery`, `useMutation`.
 *
 * @example Fetching data with QueryClient
 * ```ts
 * const api = qraftAPIClient(services, callbacks, {
 *   requestFn: requestFn,
 *   baseUrl: 'https://api.example.com',
 *   queryClient: new QueryClient(),
 * });
 *
 * api.service.operation({
 *   parameters: { path: { id: 1 } },
 * });
 * ```
 */
export declare function qraftAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends PartialServiceMethods>(services: Services, callbacks: Callbacks, options: CreateAPIQueryClientOptions): APIQueryClientServices<Services, Callbacks>;
/**
 * Creates a QueryClient compatible API Client which contains
 * only state management manipulations such as `useIsMutating`,
 * `setQueryData`, `getQueryData` and `invalidateQueries`.
 *
 * @example Invalidating queries with QueryClient
 * ```ts
 * const api = qraftAPIClient(services, callbacks, {
 *   // an instance of QueryClient shared between all clients
 *   queryClient: sharedQueryClient
 * });
 *
 * api.service.operation.invalidateQueries({
 *   parameters: { path: { id: 1 } },
 * });
 */
export declare function qraftAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends PartialServiceMethods>(services: Services, callbacks: Callbacks, options: CreateAPIBasicQueryClientOptions): APIBasicQueryClientServices<Services, Callbacks>;
/**
 * Creates a basic API Client which contains all hooks and methods
 * that don't require an explicitly provided QueryClient.
 * Hooks like `useQuery` and `useMutation` will automatically retrieve
 * the QueryClient from the `<QueryClientProvider />` context.
 *
 * @example Fetching data with QueryClient from context
 * ```ts
 * const api = qraftAPIClient(services, callbacks, {
 *   requestFn: requestFn,
 *   baseUrl: 'https://api.example.com',
 * });
 *
 * // QueryClient will be retrieved from React context
 * api.service.operation.useQuery({
 *   parameters: { path: { id: 1 } },
 * });
 * ```
 *
 * @example Fetching data without QueryClient
 * ```ts
 * const api = qraftAPIClient(services, callbacks, {
 *   requestFn: requestFn,
 *   baseUrl: 'https://api.example.com',
 * });
 *
 * api.service.operation({
 *   parameters: { path: { id: 1 } },
 * });
 * ```
 */
export declare function qraftAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends PartialServiceMethods>(services: Services, callbacks: Callbacks, options: CreateAPIBasicClientOptions): APIBasicClientServices<Services, Callbacks>;
/**
 * Creates a utility API Client which contains utility operations
 * such as `getQueryKey`, `getInfiniteQueryKey`, `getMutationKey` and state hooks
 * like `useIsFetching` and `useMutationData`.
 *
 * @example Using state hooks
 * ```ts
 * const api = qraftAPIClient(services, callbacks);
 *
 * // Check if any query is currently fetching
 * const isFetching = api.service.operation.useIsFetching();
 * ```
 *
 * @example Getting query keys with utility client
 * ```ts
 * const api = qraftAPIClient(services, callbacks);
 *
 * api.service.operation.getQueryKey({
 *   parameters: { path: { id: 1 } },
 * });
 * ```
 */
export declare function qraftAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Pick<PartialServiceMethods, UtilityOperationCallbacks>>(services: Services, callbacks: Callbacks): APIUtilityClientServices<Services, Callbacks>;
type ServiceMethods = typeof callbacks;
type PartialServiceMethods = Partial<ServiceMethods>;
type OperationDeclaration = {
    schema: OperationSchema;
    [QraftServiceOperationsToken]: Partial<Record<QueryOperationCallbacks | QueryOperationStateCallbacks | MutationOperationHookCallbacks | MutationOperationStateCallbacks | UtilityOperationCallbacks, any>> & {
        types: any;
        schema: OperationSchema;
        (...args: any[]): any;
    };
};
type OperationsDeclaration<Operations> = {
    [operation in keyof Operations]: OperationDeclaration;
};
type ServicesDeclaration<Services> = {
    [service in keyof Services]: OperationsDeclaration<Services[service]>;
};
export type UnionServiceOperationsDeclaration<Services> = ServicesDeclaration<Services> | OperationsDeclaration<Services> | OperationDeclaration;
type QueryOperationHookCallbacks = Extract<keyof ServiceMethods, 'useInfiniteQuery' | 'useQueries' | 'useQuery' | 'useSuspenseInfiniteQuery' | 'useSuspenseQueries' | 'useSuspenseQuery'>;
type QueryOperationCallbacks = Extract<keyof ServiceMethods, 'fetchInfiniteQuery' | 'fetchQuery' | 'prefetchInfiniteQuery' | 'prefetchQuery' | 'refetchQueries' | 'ensureQueryData' | 'ensureInfiniteQueryData'> | QueryOperationHookCallbacks;
type QueryOperationStateHookCallbacks = Extract<keyof ServiceMethods, 'useIsFetching'>;
type QueryOperationStateCallbacks = Extract<keyof ServiceMethods, 'cancelQueries' | 'getInfiniteQueryData' | 'getInfiniteQueryState' | 'getQueriesData' | 'getQueryData' | 'getQueryState' | 'invalidateQueries' | 'isFetching' | 'removeQueries' | 'resetQueries' | 'setInfiniteQueryData' | 'setQueriesData' | 'setQueryData'> | QueryOperationStateHookCallbacks;
type MutationOperationHookCallbacks = Extract<keyof ServiceMethods, 'useMutation'>;
type MutationOperationStateHookCallbacks = Extract<keyof ServiceMethods, 'useIsMutating' | 'useMutationState'>;
type MutationOperationStateCallbacks = Extract<keyof ServiceMethods, 'isMutating'> | MutationOperationStateHookCallbacks;
type InvokeOperationCallback = Extract<keyof typeof operationInvokeModule, 'operationInvokeFn'>;
type UtilityOperationCallbacks = Extract<keyof ServiceMethods, 'getQueryKey' | 'getInfiniteQueryKey' | 'getMutationKey' | QueryOperationStateHookCallbacks | MutationOperationStateHookCallbacks>;
type OperationCallbackList = QueryOperationCallbacks | QueryOperationStateCallbacks | MutationOperationHookCallbacks | MutationOperationStateCallbacks | InvokeOperationCallback | UtilityOperationCallbacks;
export type APIQueryClientServices<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends PartialServiceMethods> = ServicesFilteredByCallbacks<Services, Extract<keyof Callbacks, OperationCallbackList>>;
export type APIDefaultQueryClientServices<Services extends UnionServiceOperationsDeclaration<Services>> = Services extends OperationDeclaration ? Services[QraftServiceOperationsToken] : Services extends OperationsDeclaration<Services> ? {
    [operation in keyof Services]: Services[operation][QraftServiceOperationsToken];
} : Services extends ServicesDeclaration<Services> ? {
    [service in keyof Services]: {
        [operation in keyof Services[service]]: Services[service][operation][QraftServiceOperationsToken];
    };
} : never;
export type APIBasicQueryClientServices<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends PartialServiceMethods> = ServicesFilteredByCallbacks<Services, Extract<keyof Callbacks, QueryOperationStateCallbacks | MutationOperationStateCallbacks | UtilityOperationCallbacks>>;
export type APIBasicClientServices<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends PartialServiceMethods> = ServicesFilteredByCallbacks<Services, Extract<keyof Callbacks, InvokeOperationCallback | UtilityOperationCallbacks | QueryOperationHookCallbacks | QueryOperationStateHookCallbacks | MutationOperationStateHookCallbacks | MutationOperationHookCallbacks>>;
export type APIUtilityClientServices<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Pick<PartialServiceMethods, UtilityOperationCallbacks>> = ServicesFilteredByUtilityCallbacks<Services, Extract<keyof Callbacks, UtilityOperationCallbacks>>;
type ServicesFilteredByCallbacks<Services extends UnionServiceOperationsDeclaration<Services>, CallbackList extends OperationCallbackList> = Services extends OperationDeclaration ? Pick<Services[QraftServiceOperationsToken], Extract<keyof Services[QraftServiceOperationsToken], CallbackList | 'schema' | 'types'>> & OperationInvokeFn<Services[QraftServiceOperationsToken], CallbackList> : Services extends OperationsDeclaration<Services> ? {
    [operation in keyof Services]: Pick<Services[operation][QraftServiceOperationsToken], Extract<keyof Services[operation][QraftServiceOperationsToken], CallbackList | 'schema' | 'types'>> & OperationInvokeFn<Services[operation][QraftServiceOperationsToken], CallbackList>;
} : Services extends ServicesDeclaration<Services> ? {
    [serviceName in keyof Services]: {
        [operation in keyof Services[serviceName]]: Pick<Services[serviceName][operation][QraftServiceOperationsToken], Extract<keyof Services[serviceName][operation][QraftServiceOperationsToken], CallbackList | 'schema' | 'types'>> & OperationInvokeFn<Services[serviceName][operation][QraftServiceOperationsToken], CallbackList>;
    };
} : never;
type OperationInvokeFn<InvokeFn extends (...args: any[]) => any, CallbackList extends OperationCallbackList> = InvokeOperationCallback extends CallbackList ? InvokeFn extends (...args: infer Args) => infer Result ? {
    (...args: Args): Result;
} : Record<string, never> : Record<string, never>;
type ServicesFilteredByUtilityCallbacks<Services extends UnionServiceOperationsDeclaration<Services>, CallbackList extends UtilityOperationCallbacks> = Services extends OperationDeclaration ? Pick<Services[QraftServiceOperationsToken], Extract<keyof Services[QraftServiceOperationsToken], CallbackList | 'schema' | 'types'>> : Services extends OperationsDeclaration<Services> ? {
    [operation in keyof Services]: Pick<Services[operation][QraftServiceOperationsToken], Extract<keyof Services[operation][QraftServiceOperationsToken], CallbackList | 'schema' | 'types'>>;
} : Services extends ServicesDeclaration<Services> ? {
    [serviceName in keyof Services]: {
        [operation in keyof Services[serviceName]]: Pick<Services[serviceName][operation][QraftServiceOperationsToken], Extract<keyof Services[serviceName][operation][QraftServiceOperationsToken], CallbackList | 'schema' | 'types'>>;
    };
} : never;
export {};
//# sourceMappingURL=qraftAPIClient.d.ts.map