import type { ReactNode, RefObject } from 'react';
export type FileMimeType = string;
export type RestrictionFnResult = {
    code: string;
    message: string;
};
export type RestrictionFn = (value: File) => RestrictionFnResult | undefined;
export type FileId = string;
/**
 * Расширенная информация о переданном accept
 */
export type AcceptMeta = {
    extensions: string[];
    mimeTypes: string[];
    generalMimeTypes: string[];
    isOnlyExtensions: boolean;
};
export type FileStatus = {
    /**
     * Если true, будет отображен progress-бар загрузки файла
     */
    isLoading?: boolean;
    /**
     * Флаг состояния ошибки при загрузке файла
     */
    isUploadError?: boolean;
    /**
     * Флаг состояния ошибки при проверке файла на условия
     */
    isRestrictionError?: boolean;
    /**
     * текст ошибки
     */
    errorMsg?: string;
    /**
     * Значение прогресса загрузки файла. Должно быть от 0 до 100.
     */
    progress?: number;
};
export type UploadFile = {
    /**
     * Идентификатор
     */
    id: FileId;
    /**
     * Название файла
     */
    name: string;
    /**
     * MIME-тип файла
     * @example
     * { id: '1', name: 'file_name.pdf', type: 'application/pdf' }
     */
    type: string;
    /**
     * Размер файла в байтах
     */
    size?: number;
    /**
     * Объект файла
     */
    file?: File;
    /**
     * Ссылка на файле
     */
    url?: string;
    /**
     * Состояния файла
     */
    status?: FileStatus;
};
/**
 * Формат данных, ожидаемый в ответе после загрузки файла
 */
export type UploadedFileData = Omit<UploadFile, 'status'>;
/**
 * Опции для уведомлений
 */
type NotifyOptions = {
    /**
     * Дополнительный текст уведомления
     */
    content?: string;
};
export type FileUploaderNotify = {
    /**
     * Показать уведомление об успехе
     * @param title - Заголовок уведомления
     * @param options - Дополнительные опции уведомления
     * @returns Идентификатор уведомления
     */
    success: (title: string, options?: NotifyOptions) => number | string;
    /**
     * Показать уведомление об ошибке
     * @param title - Заголовок уведомления
     * @param options - Дополнительные опции уведомления
     * @returns Идентификатор уведомления
     */
    error: (title: string, options?: NotifyOptions) => number | string;
    /**
     * Показать уведомление с предупреждением
     * @param title - Заголовок уведомления
     * @param options - Дополнительные опции уведомления
     * @returns Идентификатор уведомления
     */
    warning: (title: string, options?: NotifyOptions) => number | string;
    /**
     * Показать информационное уведомление
     * @param title - Заголовок уведомления
     * @param options - Дополнительные опции уведомления
     * @returns Идентификатор уведомления
     */
    info: (title: string, options?: NotifyOptions) => number | string;
};
type BaseFileUploaderProps = {
    /**
     * Название класса, применяется к корневому компоненту
     */
    className?: string;
    /**
     * Название поля
     */
    name?: string;
    /**
     * Название поля
     */
    label?: string;
    /**
     * Массив разрешенных расширений файлов и MIME-типов
     *
     * @example
     * // Используя расширения файлов
     * accept={['.jpg', '.png', '.pdf']}
     *
     * // Используя MIME-типы
     * accept={['image/jpeg', 'image/png', 'application/pdf']}
     *
     * // Комбинируя расширения и MIME-типы
     * accept={['.jpg', 'image/png', 'application/pdf']}
     */
    accept: string[];
    /**
     * Максимальный размер файла в байтах
     */
    maxFileSize: number;
    /**
     * Если true, компонент будет недоступен для взаимодействия
     */
    isDisabled?: boolean;
    /**
     * Флаг состояния ошибки
     */
    isError?: boolean;
    /**
     * Вспомогательный текст
     */
    helperText?: ReactNode;
    /**
     * Массив функций для дополнительной валидации файлов, применяется к каждому файлу
     */
    restrictions?: RestrictionFn[];
    /**
     * Вспомогательный текст
     */
    placeholder?: string;
    /**
     * Реф для доступа к input элементу
     */
    inputRef?: RefObject<HTMLInputElement>;
    /**
     * Объект с методами для отображения уведомлений
     * @remarks
     * Используется для показа системных уведомлений при загрузке файлов
     */
    notify: FileUploaderNotify;
    /**
     * Функция для генерации ссылки на скачивание/просмотр файла
     * @param fileId - Идентификатор файла
     * @param file - Объект файла
     * @param fileUrl - URL файла, если он уже загружен
     * @returns Строка с URL для скачивания/просмотра файла
     * @example
     * generateDownloadLink: (fileId, file, fileUrl) => {
     *   return fileUrl || `/api/files/${fileId}`;
     * }
     */
    generateDownloadLink?: (fileId: FileId, file?: File, fileUrl?: string) => string;
    /**
     * Функция загрузки файлов на сервер
     * @param fileId - Идентификатор файла
     * @param file - Объект файла для загрузки
     * @param options - Опции для управления загрузкой
     * @param options.signal - AbortSignal для отмены загрузки файла
     * @param options.setProgress - Функция для обновления прогресса загрузки
     * @returns Promise с данными загруженного файла
     */
    onUploadFile?: (fileId: FileId, file: File, options: {
        signal: AbortSignal;
        setProgress: (progressFileId: FileId, progressEvent: ProgressEvent) => void;
    }) => Promise<UploadedFileData>;
    /**
     * Функция, вызываемая при удалении файла.
     * Используется для сбора идентификаторов файлов, помеченных на удаление.
     * Фактическое удаление файлов с сервера должно выполняться только при подтверждении формы,
     * чтобы избежать потери данных при отмене действия или перезагрузке страницы.
     */
    onDeleteFile?: (fileId: FileId) => Promise<void>;
    /**
     * Обработчик просмотра файла
     * @param fileId - Идентификатор файла
     * @param file - Объект файла
     * @param fileUrl - URL файла, если он уже загружен
     * @remarks
     * Если указан generateDownloadLink, то onView не нужен.
     * Используется если необходимо переопределить стандартное поведение с просмотром в новой вкладке
     * @example
     * onView: (fileId, file, fileUrl) => {
     *   openFileInModal({ fileId, file fileUrl });
     * }
     */
    onView?: (fileId: FileId, file?: File, fileUrl?: string) => void;
    /**
     * Функция, позволяющая задавать кастомный текст ошибки
     */
    getErrorMessage?: (fileId: FileId, error: Error) => string;
};
type SingleFileUploaderProps = {
    value: UploadFile | null | undefined;
    isMultiple?: false;
    maxFileCount?: never;
    /**
     * Функция, вызываемая при изменении списка файлов (добавление/удаление)
     * @param value - Объект загруженного файла или null при удалении
     * @remarks
     * Вызывается в следующих случаях:
     * - При добавлении нового файла через диалог выбора или drag-n-drop
     * - При удалении файла
     * - При изменении статуса загрузки файла (loading/success/error)
     * - При обновлении информации о файле после успешной загрузки
     */
    onChange: (value: UploadFile | null) => void;
} & BaseFileUploaderProps;
type MultipleFileUploaderProps = {
    value: UploadFile[];
    /**
     * Если true, будет доступна множественная загрузка файлов
     */
    isMultiple: true;
    /**
     * Максимальное количество файлов
     */
    maxFileCount: number;
    /**
     * Функция, вызываемая при изменении списка файлов (добавление/удаление)
     * @param value - Массив объектов загруженных файлов
     * @remarks
     * Вызывается в следующих случаях:
     * - При добавлении новых файлов через диалог выбора или drag-n-drop
     * - При удалении файла из списка
     * - При изменении статуса загрузки файла (loading/success/error)
     * - При обновлении информации о файле после успешной загрузки
     */
    onChange: (value: UploadFile[]) => void;
} & BaseFileUploaderProps;
export type FileUploaderProps = MultipleFileUploaderProps | SingleFileUploaderProps;
export type SpecificSelfFileParams = {
    /**
     * Экземпляр AbortController для отмены загрузки файла
     */
    controller?: AbortController;
};
/**
 * файл обогащенный AbortController при загрузке файла
 */
type SelfFile = UploadFile & SpecificSelfFileParams;
/**
 * Механизм для взаимодействия с внутренним поведением файлов
 */
export type SelfFileApi = {
    /**
     * Рекорд по id файла на файлы обогащенные AbortController при загрузке файла
     */
    selfFiles: Record<FileId, SelfFile>;
    /**
     * Метод для установки состояния загрузки файла
     */
    setLoadingStatusFile: (fileId: string, progress?: number | undefined) => void;
    /**
     * Метод для установки состояния успешной загрузки файла
     */
    setSuccessStatusFile: (fileId: string) => void;
    /**
     * Метод для установки состояния ошибочной загрузки файла
     */
    setErrorStatusFile: (fileId: string, errorMsg: string) => void;
    /**
     * Метод для общего обновления по id файла
     */
    updateFileInfo: (fileId: string, data: Partial<UploadedFileData> & SpecificSelfFileParams) => void;
};
export {};
