import { DocumentReference, Firestore } from "@google-cloud/firestore";
import { CoreModel, DeepPartial, Store, StoreFindResult, StoreParameters, WebdaQL } from "@webda/core";
/**
 * Definition of a FireStore index
 */
export type FireStoreIndex = {
    [key: string]: "asc" | "desc";
};
/**
 * Stored version of indexes
 */
export type FireStoreIndexOrder = {
    [key: string]: Set<"asc" | "desc">;
};
/**
 * Firebase parameters
 */
export declare class FireStoreParameters extends StoreParameters {
    /**
     * Collection to use
     */
    collection: string;
    /**
     * To allow efficient query on several fields
     *
     * @see https://firebase.google.com/docs/firestore/query-data/queries
     */
    compoundIndexes: FireStoreIndex[];
    constructor(params: DeepPartial<FireStoreParameters>, service: Store);
}
/**
 * Implement Firebase abstraction within Webda
 *
 * @WebdaModda GoogleCloudFireStore
 */
export default class FireStore<T extends CoreModel = CoreModel, K extends FireStoreParameters = FireStoreParameters> extends Store<T, K> {
    firestore: Firestore;
    compoundIndexes: {
        [key: string]: FireStoreIndexOrder;
    };
    /**
     * @override
     */
    loadParameters(params: DeepPartial<K>): FireStoreParameters;
    /**
     * @override
     */
    init(): Promise<this>;
    /**
     * Get Document Reference
     * @param uuid
     * @param collection
     * @returns
     */
    getDocumentRef(uuid: string, collection?: string): DocumentReference;
    /**
     * @override
     *
     * Return all for now
     */
    find(parsedQuery: WebdaQL.Query): Promise<StoreFindResult<T>>;
    /**
     * Manage OrderBy complex condition on Firebase
     * @param query
     * @param orderBy
     * @param rangeAttribute
     * @param index
     */
    handleOrderBy(query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData>, orderBy: WebdaQL.OrderBy[], rangeAttribute: string): FirebaseFirestore.Query<FirebaseFirestore.DocumentData>;
    /**
     * @override
     */
    _exists(uid: string): Promise<boolean>;
    /**
     * @override
     */
    _delete(uid: string, writeCondition?: any, itemWriteConditionField?: string): Promise<void>;
    /**
     * Recursively replace Timestamp by Date
     * @param doc
     * @returns
     */
    giveDatesBack(doc: any): any;
    /**
     * @override
     */
    _get(uid: string, raiseIfNotFound?: boolean): Promise<T>;
    /**
     * @override
     */
    getAll(list?: string[]): Promise<T[]>;
    /**
     * @override
     */
    _update(object: any, uid: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<any>;
    protected checkCondition(uid: string, data: any, field: string, condition: any): void;
    /***
     * Internal function that implement both update and patch
     */
    protected _setDocument(merge: boolean, object: any, uid: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<void>;
    /**
     * @override
     */
    _patch(object: any, uid: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<any>;
    /**
     * @override
     */
    _removeAttribute(uuid: string, attribute: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<void>;
    /**
     * @override
     */
    _save(object: T): Promise<any>;
    /**
     * @override
     */
    _incrementAttributes(uid: string, params: {
        property: string;
        value: number;
    }[], updateDate: Date): Promise<any>;
    /**
     * @override
     */
    _upsertItemToCollection(uid: string, prop: string, item: any, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
    /**
     * @override
     */
    _deleteItemFromCollection(uid: string, prop: string, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
    /**
     * @override
     */
    __clean(): Promise<void>;
}
export { FireStore };
