import { type ObjectAsyncGuard, type ObjectGuard } from '@astral/validations';
import { type FunctionComponent } from 'react';
import type { FieldErrors } from 'react-hook-form';
export type ChangeStepReason = 'prevStep' | 'nextStep';
export type AutoSaveStrategy = 'changeStep';
/**
 * Идентификатор шага формы.
 */
export type WizardStepId = string | number;
export type WizardStep<TFormValues extends Record<string, unknown>> = {
    /**
     * Идентификатор шага формы.
     */
    id: WizardStepId;
    /**
     * Название шага
     */
    label: string;
    /**
     * Схема валидации для полей этого шага.
     * Может быть синхронной (ObjectGuard) или асинхронной (ObjectAsyncGuard).
     */
    validationSchema?: ObjectGuard<TFormValues> | ObjectAsyncGuard<TFormValues>;
    /** Компонент, который будет отображаться на этом шаге */
    component: FunctionComponent;
    /**
     * Текст кнопки "Назад" для этого шага.
     */
    prevButtonText?: string;
    /**
     * Функция вызывается если есть ошибка валидации при отправке формы или при переходе на следующий шаг
     */
    onSubmitError?: (errors?: FieldErrors<TFormValues>) => void;
    /**
     * Текст кнопки "Далее" для этого шага.
     */
    nextButtonText?: string;
    /**
     * Условия для пропуска шага.
     *
     * @example
     * {
     *   observableFields: ['fieldName'],
     *   calculate: (formValues) => {
     *     if (formValues?.fieldName === '1')
     *     ) {
     *       return true;
     *     }
     *
     *     return false;
     *   },
     * }
     */
    shouldSkip?: {
        /**
         * Отслеживаемые поля
         */
        observableFields: string[];
        /**
         * Функция для определения, следует ли пропустить шаг
         * @param formValues - Текущее значение формы
         * @returns {boolean} - true, если шаг следует пропустить, иначе false
         */
        calculate: (formValues: Partial<TFormValues> | undefined) => boolean;
    };
};
