import type { Db, Filter, FindOptions, UpdateFilter, ObjectId, Document } from 'mongodb';
import type { DELETE_OPERATION } from './lib/MigrationBulk';
import { DELETE_COLLECTION, FETCH_ALL } from './MongoBulkDataMigration';
export type DataMigrationOptions<TSchema> = {
    arrayFilters: Document[];
    bypassRollbackValidation: boolean;
    bypassUpdateValidation: boolean;
    dontCount: boolean;
    continueOnBulkWriteError: boolean;
    maxBulkSize: number;
    maxConcurrentUpdateCalls: number;
    projectionBackupFilter?: Array<keyof TSchema>;
    rollbackable: boolean;
    throttle: number;
};
export type RollbackDocument = {
    _id: ObjectId;
    date: Date;
    backup: any;
    updateQuery: string;
};
export type RollBackUpdateObject = {
    $set?: any;
    $unset?: any;
    arrayFilters?: Document[];
};
export type MongoPipeline = object[];
export type MigrationInfos<TSchema extends Document> = {
    db: Db;
    operation?: typeof DELETE_COLLECTION;
    projection: FindOptions<TSchema>['projection'];
    rollback?: (backup?: RollbackDocument['backup']) => RollBackUpdateObject;
    query: Filter<TSchema> | MongoPipeline | typeof FETCH_ALL;
    update: UpdateFilter<TSchema> | typeof DELETE_OPERATION | ((arg: TSchema | UpdateFilter<TSchema>) => Promise<UpdateFilter<TSchema>> | UpdateFilter<TSchema>);
};
export type DataMigrationConfig<TSchema extends Document, TQuery extends Filter<TSchema> | typeof FETCH_ALL = Filter<TSchema>> = DMInstanceSpecialOperation<TSchema> | DMInstanceSpecialOperationDropDocument<TSchema, TQuery> | DMInstanceAggregate<TSchema> | DMInstanceFilter<TSchema, TQuery>;
type DMInstanceSpecialOperationDropDocument<TSchema extends Document, TQuery extends Filter<TSchema> | typeof FETCH_ALL = Filter<TSchema>> = Omit<DMInstanceFilter<TSchema, TQuery>, 'projection'> & {
    update: typeof DELETE_OPERATION;
};
type DMInstanceAggregate<TSchema> = DMInstanceBase<TSchema> & {
    query: MongoPipeline;
};
export type DMInstanceSpecialOperation<TSchema> = Pick<DMInstanceBase<TSchema>, 'db' | 'id' | 'collectionName' | 'logger' | 'options'> & {
    operation: typeof DELETE_COLLECTION;
};
export type DMInstanceFilter<TSchema extends Document, TQuery extends Filter<TSchema> | typeof FETCH_ALL = Filter<TSchema>> = DMInstanceBase<TSchema> & {
    projection: FindOptions<TSchema>['projection'];
    query: TQuery;
};
type DMInstanceBase<TSchema> = {
    collectionName: string;
    db: Db;
    id: string;
    logger?: LoggerInterface;
    options?: Partial<DataMigrationOptions<TSchema>>;
    rollback?: (backup: RollbackDocument['backup']) => RollBackUpdateObject;
    update: UpdateFilter<TSchema> | typeof DELETE_OPERATION | ((arg: TSchema) => Promise<UpdateFilter<TSchema>> | UpdateFilter<TSchema>);
};
export type LoggerInterface = {
    info: (...params: any[]) => void;
    warn: (...params: any[]) => void;
};
export interface RollbackableUpdate {
    setLogger(logger: LoggerInterface): void;
    rollback(): Promise<any>;
    update(): Promise<any>;
}
export {};
