import App from "../app";
/**
 * IndexDB 管理器模块
 *
 * 这个模块提供了对浏览器 IndexedDB 的简单封装，并在不支持 IndexedDB 的环境中
 * 自动降级使用 localStorage 作为备选存储方案。
 */
/**
 * 数据库配置选项接口
 * @interface DBOptions
 * @property {string} dbName - 数据库名称
 * @property {number} version - 数据库版本号
 * @property {Array} stores - 存储对象配置数组
 * @property {string} stores[].name - 存储对象名称
 * @property {string} stores[].keyPath - 主键路径
 * @property {Array} [stores[].indexes] - 索引配置数组（可选）
 * @property {string} stores[].indexes[].name - 索引名称
 * @property {string} stores[].indexes[].keyPath - 索引键路径
 * @property {IDBIndexParameters} [stores[].indexes[].options] - 索引选项（可选）
 */
export interface DBOptions {
    dbName: string;
    version: number;
    stores: {
        name: string;
        keyPath: string;
        indexes?: {
            name: string;
            keyPath: string;
            options?: IDBIndexParameters;
        }[];
    }[];
}
/**
 * IndexDB 管理器类
 * 提供对 IndexedDB 的简单封装，支持自动降级到 localStorage
 * @class IndexDBManager
 */
declare class IndexDBManager {
    /**
     * 检查环境是否支持 IndexedDB
     * @returns {boolean} 是否支持 IndexedDB
     * @private
     */
    private static isSupported;
    private db;
    private dbName;
    private version;
    private stores;
    private useIndexDB;
    private app;
    /**
     * 创建 IndexDBManager 实例
     * @param {DBOptions} options - 数据库配置选项
     */
    constructor(app: App, options: DBOptions);
    /**
     * 初始化数据库连接
     * 如果环境不支持 IndexedDB，将自动使用 localStorage
     * @returns {Promise<boolean>} 连接是否成功
     */
    connect(): Promise<boolean>;
    /**
     * 生成用于 localStorage 的存储键
     * @param {string} storeName - 存储对象名称
     * @param {string|number} [key] - 可选的键值
     * @returns {string} 格式化的存储键
     * @private
     */
    private getStorageKey;
    /**
     * 添加数据到指定的存储对象
     * @param {string} storeName - 存储对象名称
     * @param {T} data - 要添加的数据
     * @returns {Promise<T>} 添加的数据
     * @template T
     */
    add<T>(storeName: string, data: T): Promise<T>;
    /**
     * 获取指定存储对象中的数据
     * @param {string} storeName - 存储对象名称
     * @param {string|number} key - 数据主键
     * @returns {Promise<T|null>} 获取的数据，不存在则返回 null
     * @template T
     */
    get<T>(storeName: string, key: string | number): Promise<T | null>;
    /**
     * 更新指定存储对象中的数据
     * @param {string} storeName - 存储对象名称
     * @param {T} data - 要更新的数据
     * @returns {Promise<T>} 更新后的数据
     * @template T
     */
    update<T>(storeName: string, data: T): Promise<T>;
    /**
     * 删除指定存储对象中的数据
     * @param {string} storeName - 存储对象名称
     * @param {string|number} key - 数据主键
     * @returns {Promise<boolean>} 删除是否成功
     */
    delete(storeName: string, key: string | number): Promise<boolean>;
    /**
     * 获取指定存储对象中的所有数据
     * @param {string} storeName - 存储对象名称
     * @returns {Promise<T[]>} 数据数组
     * @template T
     */
    getAll<T>(storeName: string): Promise<T[]>;
    /**
     * 清空指定存储对象中的所有数据
     * @param {string} storeName - 存储对象名称
     * @returns {Promise<boolean>} 清空是否成功
     */
    clear(storeName: string): Promise<boolean>;
    /**
     * 关闭数据库连接
     * 在不再需要使用数据库时调用，释放资源
     */
    close(): void;
    /**
     * 获取当前使用的存储方式
     * @returns {'indexDB'|'localStorage'} 当前使用的存储方式
     */
    getCurrentStorage(): 'indexDB' | 'localStorage';
}
/**
 * 使用示例:
 *
 * // 1. 创建数据库配置
 * const dbOptions: DBOptions = {
 *   dbName: 'myApp',
 *   version: 1,
 *   stores: [
 *     {
 *       name: 'users',
 *       keyPath: 'id',
 *       indexes: [
 *         { name: 'email', keyPath: 'email', options: { unique: true } }
 *       ]
 *     },
 *     {
 *       name: 'products',
 *       keyPath: 'id'
 *     }
 *   ]
 * };
 *
 * // 2. 创建并连接数据库
 * const db = new IndexDBManager(dbOptions);
 * await db.connect();
 *
 * // 3. 添加数据
 * const user = { id: '1', name: '张三', email: 'zhangsan@example.com' };
 * await db.add('users', user);
 *
 * // 4. 获取数据
 * const retrievedUser = await db.get('users', '1');
 *
 * // 5. 更新数据
 * user.name = '张三 (已更新)';
 * await db.update('users', user);
 *
 * // 6. 获取所有数据
 * const allUsers = await db.getAll('users');
 *
 * // 7. 删除数据
 * await db.delete('users', '1');
 *
 * // 8. 清空存储对象
 * await db.clear('users');
 *
 * // 9. 关闭数据库连接
 * db.close();
 *
 * // 10. 检查当前使用的存储方式
 * const storageType = db.getCurrentStorage(); // 'indexDB' 或 'localStorage'
 */
export default IndexDBManager;
