import { Base } from '../Base/Base';
import { IQueryData, IQuery, IModelRes, IDatabaseInfo } from '../../../index';
/**
 * Тип для данных, которые хранятся в файловой базе данных
 */
export type TFileData = Record<string, Record<string, unknown>>;
/**
 * Интерфейс для хранения информации о файле
 *
 * @interface IFileInfo
 */
export interface IDBFileInfo {
    /**
     * Содержимое файла в виде строки
     */
    data?: TFileData;
    /**
     * Версия файла.
     * Используется время последнего изменения файла в миллисекундах
     */
    version: number;
    /**
     * Идентификатор тайм-аута для легкого сохранения
     */
    timeOutId?: ReturnType<typeof setTimeout> | null;
    /**
     * Идентификатор тайм-аута для строгого сохранения. Необходим для случаев, когда идет постоянная нагрузка на сервер, и нет возможности сохранить информацию в файл.
     */
    forceTimeOutId?: ReturnType<typeof setTimeout> | null;
    /**
     * Определяет было ли произведено чтение файла или нет
     */
    isFileRead: boolean;
}
/**
 * Интерфейс для хранения всех данных из файловой базы данных
 */
export interface IFileDbInfo extends IDatabaseInfo {
    [tableName: string]: IDBFileInfo | undefined;
}
/**
 * Тип для кэширования данных из файлов
 * Ключ - путь к файлу, значение - информация о файле
 */
export type IDBFileData = {
    [key: string]: IDBFileInfo | undefined;
};
/**
 * Адаптер для файловой базы данных.
 * Стоит использовать только для быстрого старта, либо для приложений, у которых объем базы не будет превышать 250мб.
 */
export declare class FileAdapter extends Base<IFileDbInfo> {
    #private;
    /**
     * Формат базы данных
     */
    dbFormat: string;
    constructor();
    connect(): Promise<boolean> | boolean;
    /**
     * Сохранение всех данные в базу
     * @param tableName Имя таблицы
     * @param data Сохраняемые данные
     */
    setCachedFileData(tableName: string, data: IDBFileInfo | undefined): void;
    /**
     * Получение всех данных из базы
     * @param tableName Имя таблицы
     */
    getCachedFileData(tableName: string): IDBFileInfo;
    /**
     * Выполняет UPDATE-запрос.
     * @param updateData Дополнительная информация для запроса. Содержит сам запроса, а также название таблицы и прочие данные.
     */
    _update(updateData: IQuery): boolean;
    /**
     * Выполняет INSERT-запрос.
     * @param insertData Дополнительная информация для запроса. Содержит сам запроса, а также название таблицы и прочие данные.
     */
    _insert(insertData: IQuery): boolean;
    /**
     * Выполняет DELETE-запрос.
     * @param removeData Дополнительная информация для запроса. Содержит сам запроса, а также название таблицы и прочие данные.
     */
    _remove(removeData: IQuery): boolean;
    /**
     * Выполняет SELECT-запрос.
     *
     * ⚠️ Файловый адаптер поддерживает только точное совпадение значений. Условия с операторами (например, $gt, $in) игнорируются.
     *
     * @param selectData Дополнительная информация для запроса. Содержит информацию о таблице и структуре.
     * @param where Сам запрос
     * @param isOne Определяет нужно ли вернуть только 1 найденную запись, либо отдать все доступные данные.
     */
    _select(selectData: IQuery, where: IQueryData | null, isOne?: boolean): IModelRes;
    /**
     * Загружает данные таблицы из JSON-файла и кэширует их в памяти.
     *
     * - При первом обращении читает файл `${tableName}.json` из директории `appConfig.json`.
     * - Данные кэшируются с привязкой к времени последнего изменения файла (mtimeMs).
     * - Если файл не изменился, возвращаются кэшированные данные.
     * - В случае ошибки парсинга делается повторная попытка (защита от гонок записи/чтения).
     *
     * Формат данных в файле:
     * ```json
     * {
     *   "user123": { "name": "Alice", "age": 30 },
     *   "user456": { "name": "Bob", "age": 25 }
     * }
     * ```
     * где ключ — значение первичного ключа.
     * В случае если файла нет, вернутся пустые данные
     * @param tableName Имя таблицы (используется как имя файла)
     */
    getFileData(tableName: string): TFileData;
    /**
     * Проверяет, установлено ли соединение с БД.
     */
    isConnected(): boolean;
    /**
     * Закрывает все подключения к файловой БД.
     * Все процессы завершаются, и происходит сохранение данных в файл.
     */
    destroy(): void;
    /**
     * Закрывает подключение к определенной таблице.
     * При закрытии, все хранящиеся в памяти данные сохраняются в файл.
     * @param tableName
     */
    close(tableName: string): void;
}
