import { IApiService } from "./ApiService";
import { IStorable } from "./Storable";
export default class ClientBuilder<RootKey extends string> {
    limit: number;
    storable: IStorable;
    api: IApiService<any>;
    generateQuery: ({ url, query }: GenerateQuery) => string;
    useCash: boolean;
    roots: {
        [key: string]: string;
    };
    private getRoot;
    clearCash: (storageKey?: string) => void;
    static clearCash: (storageKey: string, storage?: "localStorage" | "sessionStorage") => void;
    constructor({ api, limit, storage, storeKey, generateQuery, roots }: IClientFunctionsConstructor);
    GET_Blob: ({ root, url, query, headers }: IGet<RootKey>) => Promise<Blob>;
    POST_Blob: ({ root, url, query, headers, body }: IPost<RootKey>) => Promise<Blob>;
    OffsetPaginatorWithCash: <T = IQuery, Response_1 = any[]>({ root, url, getUrl, getHeaders, limit, storageKey, abortId, }: CreateCashedLoadCleintProps<T, RootKey>) => {
        hasMore: boolean;
        limit: number;
        load: (query?: T | undefined, clearCash?: boolean) => Promise<Response_1>;
        loadMore: () => Promise<Response_1>;
        reload: (query?: T | undefined) => Promise<Response_1>;
        loadAll: (query?: T | undefined) => Promise<Response_1>;
    };
    OffsetPaginator: <T = IQuery, Response_1 = any[]>({ root, url, getUrl, getHeaders, limit, abortId }: CreateLoadCleintProps<T, RootKey>) => {
        hasMore: boolean;
        limit: number;
        load: (query?: T | undefined) => Promise<Response_1>;
        loadMore: () => Promise<Response_1>;
        reload: (query?: T | undefined) => Promise<Response_1>;
        loadAll: (query?: T | undefined) => Promise<Response_1>;
    };
    PaginatorWithCash: <T = IQuery, Response_1 = any[]>({ root, url, getUrl, getHeaders, limit, storageKey, }: CreateCashedLoadCleintProps<T, RootKey>) => {
        hasMore: boolean;
        limit: number;
        load: (query?: T | undefined, clearCash?: boolean) => Promise<Response_1>;
        loadMore: () => Promise<Response_1>;
        reload: (query?: T | undefined) => Promise<Response_1>;
    };
    Paginator: <T = IQuery, Response_1 = any[]>({ root, url, getUrl, getHeaders, limit }: CreateLoadCleintProps<T, RootKey>) => {
        hasMore: boolean;
        limit: number;
        load: (query?: T | undefined) => Promise<Response_1>;
        loadMore: () => Promise<Response_1>;
        reload: (query?: T | undefined) => Promise<Response_1>;
    };
    IdPaginatorWithCash: <T = IQuery, Response_1 = any[]>({ root, url, getUrl, getHeaders, limit, storageKey, }: CreateCashedLoadCleintProps<T, RootKey>) => {
        hasMore: boolean;
        limit: number;
        load: (query?: T | undefined, clearCash?: boolean) => Promise<Response_1>;
        loadMore: () => Promise<Response_1>;
        reload: (query?: T | undefined) => Promise<Response_1>;
    };
    IdPaginator: <T = IQuery, Response_1 = any[]>({ root, url, getUrl, getHeaders, limit }: CreateLoadCleintProps<T, RootKey>) => {
        hasMore: boolean;
        limit: number;
        load: (query?: T | undefined) => Promise<Response_1>;
        loadMore: () => Promise<Response_1>;
        reload: (query?: T | undefined) => Promise<Response_1>;
    };
    GET: <Response_1 = any>({ root, url, query, headers }: IGet<RootKey>) => Promise<Response_1>;
    GET_WithCash: <Response_1 = any>({ root, url, query, headers, clearCash, storageKey, abortId }: IGet<RootKey> & ICashed) => Promise<Response_1>;
    POST: <Response_1 = any>({ root, url, query, headers, getHeaders, body, onSuccess, onError, abortId }: IPost<RootKey>) => Promise<Response_1>;
    POST_WithCash: <Response_1 = any>({ root, url, query, headers, getHeaders, body, clearCash, storageKey, onError, onSuccess, abortId, }: IPost<RootKey> & ICashed) => Promise<Response_1>;
    PUT: <Response_1 = any>({ root, url, query, headers, body, getHeaders, onError, onSuccess, abortId }: IPost<RootKey>) => Promise<Response_1>;
    UPDATE: <Response_1 = any>({ root, url, query, headers, getHeaders, body, onError, onSuccess, abortId }: IPost<RootKey>) => Promise<Response_1>;
    PATCH: <Response_1 = any>({ root, url, query, body, headers, getHeaders, onError, onSuccess, abortId }: IPost<RootKey>) => Promise<Response_1>;
    DELETE: <Response_1 = any>({ root, url, query, body, headers, getHeaders, onError, onSuccess, abortId }: IPost<RootKey>) => Promise<Response_1>;
}
type GenerateQuery = {
    url: string;
    query?: any;
};
type IQuery = {
    [key: string]: any;
};
type CreateLoadCleintProps<T, RootKey> = ({
    url: string;
    getUrl?: null;
} | {
    url?: null;
    getUrl: (query?: T) => string;
}) & {
    getHeaders?: (query?: T) => any;
    limit?: number;
    abortId?: string;
} & AmRoot<RootKey>;
type CreateCashedLoadCleintProps<T, RootKey> = CreateLoadCleintProps<T, RootKey> & {
    storageKey?: string;
};
type IClientFunctionsConstructor = {
    api?: IApiService<any>;
    limit?: number;
    storeKey?: string;
    storage?: undefined;
    generateQuery?: (props: GenerateQuery) => string;
    roots: {
        [key: string]: string;
    };
} | {
    api?: IApiService<any>;
    limit?: number;
    storeKey: string;
    storage?: "localStorage" | "sessionStorage" | "memoryStorage";
    generateQuery?: (props: GenerateQuery) => string;
    roots: {};
} | {
    api?: IApiService<any>;
    limit?: number;
    storeKey: string;
    storage: "localStorage" | "sessionStorage" | "memoryStorage";
    generateQuery?: (props: GenerateQuery) => string;
    roots: {};
};
type AmRoot<RootKey> = {
    root?: any;
} | {
    root: RootKey;
};
type IGet<RootKey> = {
    url: string;
    query?: IQuery;
    headers?: any;
    abortId?: string;
} & AmRoot<RootKey>;
type IPost<RootKey> = {
    url: string;
    body?: any;
    query?: IQuery;
    headers?: any;
    getHeaders?: (query: any) => any;
    onSuccess?: (res: any) => void;
    onError?: (err: any) => void;
    abortId?: string;
} & AmRoot<RootKey>;
type ICashed = {
    clearCash?: boolean;
    storageKey?: string;
};
export {};
