import { DefaultError, QueryKey, UndefinedInitialDataOptions, UnusedSkipTokenOptions, DefinedInitialDataOptions, UseQueryOptions, OmitKeyof, QueryFunction, UseQueryResult, DefinedUseQueryResult, DataTag, InferDataFromTag, QueryFilters, Updater, SetDataOptions, InvalidateQueryFilters, InvalidateOptions, FetchQueryOptions, RefetchQueryFilters, RefetchOptions, QueryFunctionContext, QueryClient } from '@tanstack/react-query';

type QueryFunctionContextObj<TQueryKey extends QueryKey = QueryKey> = QueryFunctionContext<TQueryKey>;
type GetFactoryQueryOptionsWithoutParams<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TQueryOptions extends UndefinedInitialDataOptions | UnusedSkipTokenOptions | DefinedInitialDataOptions = UseQueryOptions> = OmitKeyof<TQueryOptions extends UndefinedInitialDataOptions ? UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> : TQueryOptions extends UnusedSkipTokenOptions ? UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> : TQueryOptions extends DefinedInitialDataOptions ? DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> : UseQueryOptions, "queryKey" | "queryFn" | "select"> & {
    queryKey: () => TQueryKey;
    queryFn: QueryFunction<TQueryFnData, TQueryKey>;
};
type GetFactoryQueryOptionsWithParams<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TQueryOptions extends UndefinedInitialDataOptions | UnusedSkipTokenOptions | DefinedInitialDataOptions = UseQueryOptions, TParams extends Record<string, unknown> | undefined = undefined> = OmitKeyof<TQueryOptions extends UndefinedInitialDataOptions ? UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> : TQueryOptions extends UnusedSkipTokenOptions ? UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> : TQueryOptions extends DefinedInitialDataOptions ? DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> : UseQueryOptions, "queryKey" | "queryFn" | "select"> & {
    queryKey: (params: TParams) => TQueryKey;
    queryFn: (params: QueryFunctionContextObj<TQueryKey> & {
        params: TParams;
    }) => TQueryFnData | Promise<TQueryFnData>;
};
type GetFactoryQueryReturnWithoutParams<TQueryFnData = unknown, TError = DefaultError, TQueryKey extends QueryKey = QueryKey> = {
    <TData = TQueryFnData>(options?: OmitKeyof<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> | UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn">): UseQueryResult<NoInfer<TData>, TError>;
    <TData = TQueryFnData>(options: OmitKeyof<DefinedInitialDataOptions, "queryKey" | "queryFn">): DefinedUseQueryResult<NoInfer<TData>, TError>;
    getQueryKey: () => DataTag<TQueryKey, TQueryFnData, TError>;
    getQueryOptions: <TData = TQueryFnData>(options?: OmitKeyof<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> | UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> | DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn">) => (UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> | UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> | DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>) & {
        queryKey: DataTag<TQueryKey, TQueryFnData, TError>;
    };
    getQueryData: () => InferDataFromTag<TQueryFnData, TQueryKey> | undefined;
    getQueriesData: (filters?: OmitKeyof<QueryFilters, "queryKey">) => Array<[TQueryKey, TQueryFnData | undefined]>;
    setQueryData: (params: {
        updater: Updater<NoInfer<TQueryFnData> | undefined, NoInfer<TQueryFnData> | undefined>;
        options?: SetDataOptions;
    }) => NoInfer<TQueryFnData> | undefined;
    removeQueryData: (filters?: OmitKeyof<QueryFilters, "queryKey">) => void;
    removeAllQueriesData: (filters?: OmitKeyof<QueryFilters, "queryKey">) => void;
    invalidateQuery: (params?: {
        filters?: OmitKeyof<InvalidateQueryFilters<TQueryKey>, "queryKey">;
        options?: InvalidateOptions;
    }) => Promise<InferDataFromTag<TQueryFnData, TQueryKey> | undefined>;
    invalidateAllQueries: (params?: {
        filters?: OmitKeyof<InvalidateQueryFilters<TQueryKey>, "queryKey">;
        options?: InvalidateOptions;
    }) => Promise<Array<[TQueryKey, TQueryFnData | undefined]>>;
    prefetch: <TData = TQueryFnData>(options?: OmitKeyof<FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn">) => Promise<InferDataFromTag<TQueryFnData, TQueryKey> | undefined>;
    refetchQuery: (params?: {
        filters?: OmitKeyof<RefetchQueryFilters<TQueryKey>, "queryKey">;
        options?: RefetchOptions;
    }) => Promise<InferDataFromTag<TQueryFnData, TQueryKey> | undefined>;
    refetchAllQueries: (params?: {
        filters?: OmitKeyof<RefetchQueryFilters<TQueryKey>, "queryKey">;
        options?: RefetchOptions;
    }) => Promise<Array<[TQueryKey, TQueryFnData | undefined]>>;
};
type GetFactoryQueryReturnWithParams<TQueryFnData = unknown, TError = DefaultError, TQueryKey extends QueryKey = QueryKey, TParams extends Record<string, unknown> | undefined = undefined> = {
    <TData = TQueryFnData>(options: OmitKeyof<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> | UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn"> & {
        params: TParams;
    }): UseQueryResult<NoInfer<TData>, TError>;
    <TData = TQueryFnData>(options: OmitKeyof<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn"> & {
        params: TParams;
    }): DefinedUseQueryResult<NoInfer<TData>, TError>;
    getQueryKey: (params: {
        params: TParams;
    }) => DataTag<TQueryKey, TQueryFnData, TError>;
    getQueryOptions: <TData = TQueryFnData>(options?: OmitKeyof<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> | UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> | DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn"> & {
        params: TParams;
    }) => (UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> | UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> | DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>) & {
        queryKey: DataTag<TQueryKey, TQueryFnData, TError>;
    };
    getQueryData: (params: {
        params: TParams;
    }) => InferDataFromTag<TQueryFnData, TQueryKey> | undefined;
    getQueriesData: (filters?: OmitKeyof<QueryFilters, "queryKey">) => Array<[TQueryKey, TQueryFnData | undefined]>;
    setQueryData: (params: {
        params: TParams;
        updater: Updater<NoInfer<TQueryFnData> | undefined, NoInfer<TQueryFnData> | undefined>;
        options?: SetDataOptions;
    }) => NoInfer<TQueryFnData> | undefined;
    removeQueryData: (filters: OmitKeyof<QueryFilters, "queryKey"> & {
        params: TParams;
    }) => void;
    removeAllQueriesData: (filters?: OmitKeyof<QueryFilters, "queryKey">) => void;
    invalidateQuery: (params: {
        filters?: OmitKeyof<InvalidateQueryFilters<TQueryKey>, "queryKey">;
        params: TParams;
        options?: InvalidateOptions;
    }) => Promise<InferDataFromTag<TQueryFnData, TQueryKey> | undefined>;
    invalidateAllQueries: (params?: {
        filters?: OmitKeyof<InvalidateQueryFilters<TQueryKey>, "queryKey">;
        options?: InvalidateOptions;
    }) => Promise<Array<[TQueryKey, TQueryFnData | undefined]>>;
    prefetch: <TData = TQueryFnData>(options: OmitKeyof<FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn"> & {
        params: TParams;
    }) => Promise<InferDataFromTag<TQueryFnData, TQueryKey> | undefined>;
    refetchQuery: (params: {
        filters?: OmitKeyof<RefetchQueryFilters<TQueryKey>, "queryKey">;
        params: TParams;
        options?: RefetchOptions;
    }) => Promise<InferDataFromTag<TQueryFnData, TQueryKey> | undefined>;
    refetchAllQueries: (params?: {
        filters?: OmitKeyof<RefetchQueryFilters<TQueryKey>, "queryKey">;
        options?: RefetchOptions;
    }) => Promise<Array<[TQueryKey, TQueryFnData | undefined]>>;
};

declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(factoryOptions: GetFactoryQueryOptionsWithoutParams<TQueryFnData, TError, TData, TQueryKey, DefinedInitialDataOptions>, factoryQueryClient: QueryClient): GetFactoryQueryReturnWithoutParams<TQueryFnData, TError, TQueryKey>;
declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(factoryOptions: GetFactoryQueryOptionsWithoutParams<TQueryFnData, TError, TData, TQueryKey, UnusedSkipTokenOptions>, factoryQueryClient: QueryClient): GetFactoryQueryReturnWithoutParams<TQueryFnData, TError, TQueryKey>;
declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(factoryOptions: GetFactoryQueryOptionsWithoutParams<TQueryFnData, TError, TData, TQueryKey, UndefinedInitialDataOptions>, factoryQueryClient: QueryClient): GetFactoryQueryReturnWithoutParams<TQueryFnData, TError, TQueryKey>;
declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TParams extends Record<string, unknown> | undefined = undefined>(factoryOptions: GetFactoryQueryOptionsWithParams<TQueryFnData, TError, TData, TQueryKey, DefinedInitialDataOptions, TParams>, factoryQueryClient: QueryClient): GetFactoryQueryReturnWithParams<TQueryFnData, TError, TQueryKey, TParams>;
declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TParams extends Record<string, unknown> | undefined = undefined>(factoryOptions: GetFactoryQueryOptionsWithParams<TQueryFnData, TError, TData, TQueryKey, UnusedSkipTokenOptions, TParams>, factoryQueryClient: QueryClient): GetFactoryQueryReturnWithParams<TQueryFnData, TError, TQueryKey, TParams>;
declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TParams extends Record<string, unknown> | undefined = undefined>(factoryOptions: GetFactoryQueryOptionsWithParams<TQueryFnData, TError, TData, TQueryKey, UndefinedInitialDataOptions, TParams>, factoryQueryClient: QueryClient): GetFactoryQueryReturnWithParams<TQueryFnData, TError, TQueryKey, TParams>;

declare function createQueryFactory(queryClient: QueryClient): {
    <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[]>(factoryOptions: GetFactoryQueryOptionsWithoutParams<TQueryFnData, TError, TData, TQueryKey, DefinedInitialDataOptions>): GetFactoryQueryReturnWithoutParams<TQueryFnData, TError, TQueryKey>;
    <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[]>(factoryOptions: GetFactoryQueryOptionsWithoutParams<TQueryFnData, TError, TData, TQueryKey, UnusedSkipTokenOptions>): GetFactoryQueryReturnWithoutParams<TQueryFnData, TError, TQueryKey>;
    <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[]>(factoryOptions: GetFactoryQueryOptionsWithoutParams<TQueryFnData, TError, TData, TQueryKey, UndefinedInitialDataOptions>): GetFactoryQueryReturnWithoutParams<TQueryFnData, TError, TQueryKey>;
    <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[], TParams extends Record<string, unknown> | undefined = undefined>(factoryOptions: GetFactoryQueryOptionsWithParams<TQueryFnData, TError, TData, TQueryKey, DefinedInitialDataOptions, TParams>): GetFactoryQueryReturnWithParams<TQueryFnData, TError, TQueryKey, TParams>;
    <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[], TParams extends Record<string, unknown> | undefined = undefined>(factoryOptions: GetFactoryQueryOptionsWithParams<TQueryFnData, TError, TData, TQueryKey, UnusedSkipTokenOptions, TParams>, factoryQueryClient: QueryClient): GetFactoryQueryReturnWithParams<TQueryFnData, TError, TQueryKey, TParams>;
    <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[], TParams extends Record<string, unknown> | undefined = undefined>(factoryOptions: GetFactoryQueryOptionsWithParams<TQueryFnData, TError, TData, TQueryKey, UndefinedInitialDataOptions, TParams>): GetFactoryQueryReturnWithParams<TQueryFnData, TError, TQueryKey, TParams>;
};

export { createQuery, createQueryFactory };
