import { DocumentSnapshot } from "firebase-admin/firestore";
import type { Change } from "firebase-functions";
import type { OPaths } from "./helpers/types";
import { WhereClause } from "./helpers/typesFirestore";
export declare type UpdateFoundDocs<T = Record<string, any>> = {
    /**
     * The target collection to grab documents in to update
     */
    collection: string;
    /**
     * The name of the prop on the origin document that is should be equal to `keyTarget`
     * @example 'id'
     */
    keyOrigin: OPaths<T>;
    /**
     * The name of the prop on the target document in this collection that is should be equal to `keyOrigin`
     *
     * Can be left out if `{keyTarget}` is part of the `collection` path
     * @example 'userId'
     */
    keyTarget?: string;
    /**
     * A custom where function to search docs by
     *
     * Can be left out if `keyTarget` is provided
     * @example ['userIds.{keyTarget}', '==', true]
     */
    where?: WhereClause[];
};
export declare type UpdateSpecificDoc = {
    /**
     * The target doc that must be updated in reaction
     *
     * Can be have `{keyTarget}` is part of the `collection` path
     */
    doc: string;
};
export declare type Reaction<T extends Record<string, any> = Record<string, any>> = {
    /**
     * The name of the prop which when updated will cause all `updates` to be triggered in reaction
     */
    prop: OPaths<T>;
    /**
     * When set, it will only do reactive updates if this `value`
     */
    value?: string;
    /**
     * The updates you want to make
     */
    updates: ((UpdateSpecificDoc | UpdateFoundDocs<T>) & {
        /**
         * The name of the prop that must be updated to be the same value as the `prop` defined in this Reaction
         */
        propToUpdate: string;
    })[];
};
export declare type Increment<T extends Record<string, any> = Record<string, any>> = {
    /**
     * @param newData — undefined if this is a deletion, otherwise the updated/created record
     * @param oldData — undefined if this is a creation, otherwise the updated/deleted record
     * - returning a positive number will increment the `propToIncrement` by this amount
     * - returning a positive number will decrement the `propToIncrement` by this amount
     * - returning 0 will stop execution
     */
    incrementBy: (newData?: T, oldData?: T) => number;
    /**
     * 変更先の情報
     */
    increments: ((UpdateSpecificDoc | UpdateFoundDocs<T>) & {
        /**
         * The name of the prop that must be incremented with Firestore's increment helper fn
         */
        propToIncrement: string;
    })[];
};
export declare const executeReaction: ({ change, reaction, }: {
    change: Change<DocumentSnapshot>;
    reaction: Reaction<any>;
}) => Promise<Promise<any>>;
export declare const executeIncrement: ({ change, increment, }: {
    change: Change<DocumentSnapshot>;
    increment: Increment<any>;
}) => Promise<Promise<any>>;
export declare const firebaseAutoSync: ({ change, reaction, increment, }: {
    change: Change<DocumentSnapshot>;
    reaction?: Reaction<any> | undefined;
    increment?: Increment<any> | undefined;
}) => Promise<any>;
