import preferences from '@ohos.data.preferences';
import common from '@ohos.app.ability.common';

// 定义支持的数据类型
type ValueType = number | string | boolean | number[] | string[] | boolean[];

class PreferencesUtil {
  // 缓存多个 Preferences 实例
  private prefMap: Map<string, preferences.Preferences> = new Map();

  /**
  * 加载 Preferences 文件
  * @param context 应用上下文
  * @param name 文件名（如 'userConfig'）
  */
  async loadPreference(context: common.Context, name: string): Promise<void> {
    try {
      const pref = await preferences.getPreferences(context, name);
      this.prefMap.set(name, pref);
      console.log('hhtest', `[PreferencesUtil] 加载文件 "${name}" 成功`);
    } catch (err) {
      console.error('hhtest', `[PreferencesUtil] 加载失败: ${JSON.stringify(err)}`);
    }
  }

  /**
  * 写入数据（自动刷盘）
  * @param fileName 文件名
  * @param key 键名
  * @param value 值（支持6种类型）
  */
  async put(fileName: string, key: string, value: ValueType): Promise<void> {
    const pref = this.prefMap.get(fileName);
    if (!pref) {
      console.warn('hhtest', `[PreferencesUtil] 文件未加载: ${fileName}`);
      return;
    }

    try {
      await pref.put(key, value);
      await pref.flush(); // 立即持久化
      console.log('hhtest', `[PreferencesUtil] 保存 ${fileName}.${key} = ${value}`);
    } catch (err) {
      console.error('hhtest', `[PreferencesUtil] 写入失败: ${JSON.stringify(err)}`);
    }
  }

  /**
  * 读取数据（带默认值）
  * @param fileName 文件名
  * @param key 键名
  * @param defaultValue 默认值
  * @returns 类型安全的返回值
  */
  async get<T extends ValueType>(
    fileName: string,
    key: string,
    defaultValue: T
  ): Promise<T> {
    const pref = this.prefMap.get(fileName);
    if (!pref) {
      console.warn('hhtest', `[PreferencesUtil] 文件未加载: ${fileName}`);
      return defaultValue;
    }

    try {
      const value = await pref.get(key, defaultValue);
      console.log('hhtest', `[PreferencesUtil] 读取 ${fileName}.${key} = ${value}`);
      return value as T; // 泛型类型断言
    } catch (err) {
      console.error('hhtest', `[PreferencesUtil] 读取失败: ${JSON.stringify(err)}`);
      return defaultValue;
    }
  }

  /**
  * 删除指定键值
  * @param fileName 文件名
  * @param key 键名
  */
  async delete(fileName: string, key: string): Promise<void> {
    const pref = this.prefMap.get(fileName);
    if (!pref) return;

    try {
      await pref.delete(key);
      await pref.flush();
      console.log('hhtest', `[PreferencesUtil] 删除键值: ${fileName}.${key}`);
    } catch (err) {
      console.error('hhtest', `[PreferencesUtil] 删除失败: ${JSON.stringify(err)}`);
    }
  }

  /**
  * 清空文件数据
  * @param fileName 文件名
  */
  async clear(fileName: string): Promise<void> {
    const pref = this.prefMap.get(fileName);
    if (!pref) return;

    try {
      await pref.clear();
      await pref.flush();
      console.log('hhtest', `[PreferencesUtil] 已清空文件: ${fileName}`);
    } catch (err) {
      console.error('hhtest', `[PreferencesUtil] 清空失败: ${JSON.stringify(err)}`);
    }
  }
}

// 导出单例（全局使用）
const preferencesUtil = new PreferencesUtil();
export default preferencesUtil;