import { BehaviorSubject, Observable } from "rxjs";
import { TupleSelector } from "../TupleSelector";
import { NgOnDestroyEventI } from "../../util/NgLifeCycleEvents";
import { FormGroup } from "@angular/forms";
import { TupleDataLoaderTupleABC } from "./TupleDataLoaderTupleABC";
export declare class TupleDataNotValidError extends Error {
    constructor(message?: string);
}
export declare class TupleDataLoaderDelegate<TupleType extends TupleDataLoaderTupleABC> {
    private lifeCycleEvents;
    private userUuid$;
    readonly ANIMATION_WAIT_TIME_MS = 400;
    /** Loading indicators **/
    readonly loading$: BehaviorSubject<boolean>;
    readonly storing$: BehaviorSubject<boolean>;
    readonly deleting$: BehaviorSubject<boolean>;
    readonly ready$: BehaviorSubject<boolean>;
    readonly data$: BehaviorSubject<TupleType>;
    readonly selector$: BehaviorSubject<TupleSelector>;
    readonly uuid: string;
    readonly dataLocked$: BehaviorSubject<boolean>;
    readonly lockExpires$: BehaviorSubject<Date>;
    /**
     * Returns an observable of boolean indicating if data has been deleted.
     *
     * @return {Observable<boolean>} An observable that emits
     *  a boolean value indicating if data has been deleted.
     */
    get dataDeleted$(): Observable<void>;
    private _dataDeletedSubject;
    private readonly formGroupDirty$;
    readonly dataDirtyOrWeHaveLock$: BehaviorSubject<boolean>;
    private _dataLoader;
    readonly formGroup$: BehaviorSubject<FormGroup<any>>;
    private registeredName;
    constructor(lifeCycleEvents: NgOnDestroyEventI, userUuid$: BehaviorSubject<string>);
    private synchroniseFormGroupToDataTuple;
    private animationDelay;
    private resetFormGroupDirty;
    private setFormGroupDirty;
    private get formGroupDirty();
    private resetDataDirtyOrWeHaveLock;
    private setDataDirtyOrWeHaveLock;
    get dataLocked(): boolean;
    get dataDirtyOrWeHaveLock(): boolean;
    get selector(): TupleSelector | null;
    private get formGroup();
    private set ready(value);
    private set storing(value);
    private set loading(value);
    private set deleting(value);
    get data(): TupleType;
    set data(value: TupleType);
    private setDataLoader;
    private processDataUpdate;
    private processLockStatus;
    /**
     * Validates the form and throws an error if it is
     * incomplete or contains errors.
     *
     * @throws {TupleDataNotValidError} If the form is incomplete
     * or contains errors.
     *
     * @return {void}
     */
    validateForm(): void;
    create(withAnimationDelay?: boolean): Promise<void>;
    store(withAnimationDelay?: boolean): Promise<void>;
    load(withAnimationDelay?: boolean): Promise<void>;
    revert(withAnimationDelay?: boolean): Promise<void>;
    delete(withAnimationDelay?: boolean): Promise<void>;
    private lockForEditing;
}
