import { type DefaultValues, type FieldErrors } from 'react-hook-form';
import { useForm } from '../useForm';
import type { AutoSaveStrategy, ChangeStepReason, WizardStep, WizardStepId } from './types';
export type UseFormWizardParams<TFormValues extends Record<string, unknown>> = {
    /**
     * Значения полей формы по умолчанию
     */
    defaultValues?: DefaultValues<TFormValues>;
    /**
     * Идентификатор начального шага
     */
    initialStepId?: WizardStepId;
    /**
     * Стратегия автосохранения формы
     * - `changeStep` — автосохранение при смене шага.
     * - `changeValues` — автосохранение при изменении значения поля.
     * @default `changeStep`
     */
    autoSaveStrategy?: AutoSaveStrategy;
    /**
     * Если true, форма будет недоступна для редактирования.
     */
    isDisabled?: boolean;
    /**
     * Массив шагов формы.
     * @example
     * const steps = [
     *   { id: 1, label: 'Step 1', component: StepOneComponent },
     *   { id: 2, label: 'Step 2', component: StepTwoComponent }
     * ];
     */
    steps: WizardStep<TFormValues>[];
    /**
     * Функция, вызываемая при смене шага.
     * Если при переходе на следующий возвращает promise, то переход будет заблокирован до завершения promise
     * @param nextStepId - Идентификатор шага, на который происходит переход.
     * @param options - Объект с дополнительными параметрами смены шага.
     * @param options.reason - Причина смены шага.
     * @param options.autosavePromise - Promise автосохранения. Используется, если необходимо дождаться автосохранения для перехода на следующий шаг
     * @example
     * onChangeStep: (nextStepId, { reason, autosavePromise }) => {
     *   if (reason === 'nextStep') {
     *     // переход на следующий шаг будет заблокирован, пока не произошло автосохранение
     *     return autosavePromise;
     *   }
     * }
     */
    onChangeStep?: (nextStepId: WizardStepId, meta: {
        reason: ChangeStepReason;
        autosavePromise?: Promise<void>;
    }) => void | Promise<void>;
    /**
     * Функция, вызываемая при автосохранение формы.
     * @param formValues - Значения формы.
     */
    onAutoSave?: (formValues: Partial<TFormValues>) => Promise<void>;
    /**
     * Функция,вызываемая при возникновении ошибок во время операции авто-сохранения
     */
    onAutoSaveError?: (error: Error) => void;
    /**
     * Функция, вызываемая при отправке формы.
     * @param formValues - Значения формы.
     */
    onSubmit: (formValues: TFormValues) => void | Promise<void>;
};
/**
 * Тип, описывающий возвращаемые значения из useFormWizard.
 * @template TFormValues - Тип значений формы.
 */
export type UseFormWizardResult<TFormValues extends Record<string, unknown>> = {
    /**
     * Объект формы, возвращаемый из useForm.
     */
    form: ReturnType<typeof useForm<TFormValues>>;
    /**
     * Идентификатор текущего шага.
     */
    currentStepId: WizardStepId;
    /**
     * Указывает, является ли текущий шаг первым.
     */
    isFirstStep: boolean;
    /**
     * Указывает, является ли текущий шаг последним.
     */
    isLastStep: boolean;
    /**
     * Массив шагов, которые нужно отобразить.
     */
    steps: WizardStep<TFormValues>[];
    /**
     * Функция для установки любого текущего шага
     */
    setCurrentStepId: (stepId: WizardStepId) => void;
    /**
     * Функция для установки любого текущего шага по индексу.
     * Используется для быстрого возврата на предыдущие шаги
     */
    onClickStep: (index: number) => void;
    /**
     * Функция для перехода на предыдущий шаг.
     */
    onPrevStep: () => void;
    /**
     * Функция для отправки формы.
     */
    onSubmit: (formValues: TFormValues) => void | Promise<void>;
    /**
     * Функция вызывается если есть ошибка валидации при отправке формы или при переходе на следующий шаг
     */
    onSubmitError: (errors: FieldErrors<TFormValues>) => void;
};
/**
 * Хук useFormWizard предназначен для управления многошаговыми формами.
 *
 * @example
 * const allSteps = [
 *   { id: 1, label: 'Step 1', component: StepOneComponent },
 *   { id: 2, label: 'Step 2', component: StepTwoComponent }
 * ];
 *
 * const handleSubmit = (formValues) => {}
 *
 * const formWizardProps = useFormWizard({ steps: allSteps, onSubmit: handleSubmit});
 *
 * <FormWizard {...formWizardProps} />
 */
export declare const useFormWizard: <TFormValues extends Record<string, unknown>>({ initialStepId, defaultValues, isDisabled, steps, autoSaveStrategy, onChangeStep, onAutoSave, onSubmit, onAutoSaveError, }: UseFormWizardParams<TFormValues>) => UseFormWizardResult<TFormValues>;
