import { Hydrated } from "../center";
import { TypeStateManagerConfigs } from "../state-manager";
import { ReactStateManager } from "./state-manager";
import { ReactStoreManager } from "./store";
export declare class ReactFormManager<DataType extends Record<string, any>, ErrorType = string[] | undefined | null, Meta = Record<string, any>> {
    protected _config: ReactFormManagerConfig<DataType, ErrorType, Meta>;
    protected readonly _KEYS: (keyof Required<DataType>)[];
    protected _fields: {
        [Key in keyof Required<DataType>]: Entities<DataType[Key], ErrorType>;
    };
    get fields(): Readonly<{
        [Key in keyof Required<DataType>]: Entities<DataType[Key], ErrorType>;
    }>;
    get KEYS(): (keyof Required<DataType>)[];
    get meta(): Meta;
    get hooks(): Readonly<{
        useField: <Key extends keyof DataType>(name: Key) => {
            value: DataType[Key];
            setValue: (newValue: DataType[Key]) => void;
            error: { [Key_1 in keyof DataType]?: ErrorType | undefined; }[Key];
            setError: (newState: { [Key_1 in keyof DataType]?: ErrorType | undefined; }[Key]) => void;
            touched: { [Key_2 in keyof DataType]?: boolean | undefined; }[Key];
            setTouched: (newState: { [Key_2 in keyof DataType]?: boolean | undefined; }[Key]) => void;
            modified: { [Key_3 in keyof DataType]?: boolean | undefined; }[Key];
            setModified: (newState: { [Key_3 in keyof DataType]?: boolean | undefined; }[Key]) => void;
            setAsTouched: () => void;
            setAsModified: () => void;
            _setValue: (newState: DataType[Key]) => void;
        };
        useData: () => [state: DataType, setState: (newValue: DataType) => void];
        useErrors: () => [state: { [Key in keyof DataType]?: ErrorType | undefined; }, setState: (newValue: { [Key in keyof DataType]?: ErrorType | undefined; }) => void];
        useTouched: () => [state: { [Key in keyof DataType]?: boolean | undefined; }, setState: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void];
        useModified: () => [state: { [Key in keyof DataType]?: boolean | undefined; }, setState: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void];
        useForm: () => {
            data: DataType;
            setData: (newValue: DataType) => void;
            errors: { [Key in keyof DataType]?: ErrorType | undefined; };
            setErrors: (newValue: { [Key in keyof DataType]?: ErrorType | undefined; }) => void;
            touched: { [Key in keyof DataType]?: boolean | undefined; };
            setTouched: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void;
            modified: { [Key in keyof DataType]?: boolean | undefined; };
            setModified: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void;
        };
        useIsModified: () => [isModified: boolean];
        useIsTouched: () => [isTouched: boolean];
        useHasErrors: () => [hasErrors: boolean];
    }>;
    protected readonly _truthyValues: {
        [Key in keyof Required<DataType>]: true;
    };
    protected readonly _falsyValues: {
        [Key in keyof Required<DataType>]: false;
    };
    protected readonly _data: ReactStoreManager<DataType>;
    get data(): { [Key in keyof Required<DataType>]: ReactStateManager<DataType[Key]>; };
    protected readonly _errors: ReactStoreManager<{
        [Key in keyof DataType]?: ErrorType;
    }>;
    get errors(): { [Key_1 in keyof Required<{ [Key in keyof DataType]?: ErrorType | undefined; }>]: ReactStateManager<{ [Key in keyof DataType]?: ErrorType | undefined; }[Key_1]>; };
    protected readonly _touched: ReactStoreManager<{
        [Key in keyof DataType]?: boolean;
    }>;
    get touched(): { [Key_1 in keyof Required<{ [Key in keyof DataType]?: boolean | undefined; }>]: ReactStateManager<{ [Key in keyof DataType]?: boolean | undefined; }[Key_1]>; };
    protected readonly _modified: ReactStoreManager<{
        [Key in keyof DataType]?: boolean;
    }>;
    get modified(): { [Key_1 in keyof Required<{ [Key in keyof DataType]?: boolean | undefined; }>]: ReactStateManager<{ [Key in keyof DataType]?: boolean | undefined; }[Key_1]>; };
    get value(): {
        data: DataType;
        errors: {
            [Key in keyof DataType]: ErrorType | undefined;
        };
        touched: {
            [Key in keyof DataType]: boolean | undefined;
        };
        modified: {
            [Key in keyof DataType]: boolean | undefined;
        };
    };
    set value(newValues: {
        data?: Partial<DataType>;
        errors?: {
            [Key in keyof DataType]?: ErrorType | undefined;
        };
        touched?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
        modified?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
    });
    update(updater: {
        data?: Partial<DataType>;
        errors?: {
            [Key in keyof DataType]?: ErrorType | undefined;
        };
        touched?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
        modified?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
    } | ((prev: {
        data: DataType;
        errors: {
            [Key in keyof DataType]: ErrorType | undefined;
        };
        touched: {
            [Key in keyof DataType]: boolean | undefined;
        };
        modified: {
            [Key in keyof DataType]: boolean | undefined;
        };
    }) => {
        data?: Partial<DataType>;
        errors?: {
            [Key in keyof DataType]?: ErrorType | undefined;
        };
        touched?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
        modified?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
    })): this;
    protected readonly _validators: {
        [Key in keyof Required<DataType>]: (value: any) => void;
    } | undefined;
    protected readonly _hooks: Readonly<{
        useField: <Key extends keyof DataType>(name: Key) => {
            value: DataType[Key];
            setValue: (newValue: DataType[Key]) => void;
            error: { [Key_1 in keyof DataType]?: ErrorType | undefined; }[Key];
            setError: (newState: { [Key_1 in keyof DataType]?: ErrorType | undefined; }[Key]) => void;
            touched: { [Key_2 in keyof DataType]?: boolean | undefined; }[Key];
            setTouched: (newState: { [Key_2 in keyof DataType]?: boolean | undefined; }[Key]) => void;
            modified: { [Key_3 in keyof DataType]?: boolean | undefined; }[Key];
            setModified: (newState: { [Key_3 in keyof DataType]?: boolean | undefined; }[Key]) => void;
            setAsTouched: () => void;
            setAsModified: () => void;
            _setValue: (newState: DataType[Key]) => void;
        };
        useData: () => [state: DataType, setState: (newValue: DataType) => void];
        useErrors: () => [state: { [Key in keyof DataType]?: ErrorType | undefined; }, setState: (newValue: { [Key in keyof DataType]?: ErrorType | undefined; }) => void];
        useTouched: () => [state: { [Key in keyof DataType]?: boolean | undefined; }, setState: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void];
        useModified: () => [state: { [Key in keyof DataType]?: boolean | undefined; }, setState: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void];
        useForm: () => {
            data: DataType;
            setData: (newValue: DataType) => void;
            errors: { [Key in keyof DataType]?: ErrorType | undefined; };
            setErrors: (newValue: { [Key in keyof DataType]?: ErrorType | undefined; }) => void;
            touched: { [Key in keyof DataType]?: boolean | undefined; };
            setTouched: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void;
            modified: { [Key in keyof DataType]?: boolean | undefined; };
            setModified: (newValue: { [Key in keyof DataType]?: boolean | undefined; }) => void;
        };
        useIsModified: () => [isModified: boolean];
        useIsTouched: () => [isTouched: boolean];
        useHasErrors: () => [hasErrors: boolean];
    }>;
    reset(resetValues?: {
        data?: Partial<DataType>;
        modified?: {
            [Key in keyof DataType]?: boolean;
        };
        touched?: {
            [Key in keyof DataType]?: boolean;
        };
        errors?: {
            [Key in keyof DataType]?: ErrorType;
        };
    }): void;
    setAllAsTouched(): void;
    setAllAsUntouched(): void;
    setAllAsModified(): void;
    setAllAsUnmodified(): void;
    getModifiedValues({ defaultFields, }?: {
        defaultFields: (keyof Required<DataType>)[];
    }): Partial<DataType>;
    get hasErrors(): boolean;
    get isModified(): boolean;
    get isTouched(): boolean;
    hydrate(value: {
        data: DataType;
        errors?: {
            [Key in keyof DataType]?: ErrorType | undefined;
        };
        touched?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
        modified?: {
            [Key in keyof DataType]?: boolean | undefined;
        };
    }): {
        update: (record: Hydrated["data"]) => void;
        value: {
            data: DataType;
            errors?: { [Key in keyof DataType]?: ErrorType | undefined; };
            touched?: { [Key in keyof DataType]?: boolean | undefined; };
            modified?: { [Key in keyof DataType]?: boolean | undefined; };
        };
    };
    fulfill(): Promise<any>;
    constructor(initialValues: {
        [Key in keyof Required<DataType>]: DataType[Key];
    }, _config?: ReactFormManagerConfig<DataType, ErrorType, Meta>);
}
export declare function form<DataType extends Record<string, any>, ErrorType = string[] | undefined | null, Meta = Record<string, any>>(initialValues: {
    [Key in keyof Required<DataType>]: DataType[Key];
}, config?: ReactFormManagerConfig<DataType, ErrorType, Meta>): ReactFormManager<DataType, ErrorType, Meta>;
declare class Entities<DataType, ErrorType> {
    readonly data: ReactStateManager<DataType>;
    readonly error: ReactStateManager<ErrorType | undefined>;
    readonly modified: ReactStateManager<boolean | undefined>;
    readonly touched: ReactStateManager<boolean | undefined>;
    constructor(data: ReactStateManager<DataType>, error: ReactStateManager<ErrorType | undefined>, modified: ReactStateManager<boolean | undefined>, touched: ReactStateManager<boolean | undefined>);
    get values(): EntitiesType<DataType, ErrorType>;
    set values(values: EntitiesType<DataType, ErrorType>);
    update(updater: (prev: EntitiesType<DataType, ErrorType>) => EntitiesType<DataType, ErrorType>): this;
}
type EntitiesType<DataType, ErrorType> = {
    data: DataType;
    error: ErrorType | undefined;
    modified: boolean | undefined;
    touched: boolean | undefined;
};
export type ReactFormManagerConfig<DataType extends Record<string, any>, ErrorType = string[] | undefined | null, Meta = Record<string, any>> = {
    uid: string;
    getValidator?: (fieldName: keyof DataType, form: ReactFormManager<DataType, ErrorType>) => (value: any) => void;
    onReset?: () => void;
    hasError?: (error: ErrorType | undefined) => boolean;
    meta?: Meta;
    errors?: {
        [Key in keyof DataType]?: StateConfig<ErrorType | undefined>;
    };
    touched?: {
        [Key in keyof DataType]?: StateConfig<boolean | undefined>;
    };
    modified?: {
        [Key in keyof DataType]?: StateConfig<boolean | undefined>;
    };
    data?: {
        [Key in keyof DataType]?: StateConfig<DataType[Key]>;
    };
};
type StateConfig<DataType> = Omit<TypeStateManagerConfigs<DataType>, "uid">;
export {};
