/**
 * Tauri会话存储实现
 * 在应用程序运行期间对所有窗口可见，页面刷新后仍然有效，但应用关闭后数据将不再存在
 * 兼容纯网页环境：使用 store2 的 sessionStorage 实现
 */

import { invoke, isTauri } from '@tauri-apps/api/core';
import store from 'store2';

const IS_TAURI = isTauri();

// 定义存储命令类型
export const STORAGE_COMMANDS = {
  GET: 'session_storage_get',
  SET: 'session_storage_set',
  REMOVE: 'session_storage_remove',
  CLEAR: 'session_storage_clear',
  KEYS: 'session_storage_keys',
  CHANGE: 'session_storage_changed',
};

// 会话存储代理类
class TauriSessionStorage {
  public constructor() {
    // 在非 Tauri 环境下，使用 store2 的 sessionStorage
    if (!IS_TAURI) {
      console.log('使用 store2 sessionStorage（纯网页环境）');
    }
  }

  // 获取值
  public async get(key: string): Promise<unknown | null> {
    try {
      if (IS_TAURI) {
        // 从 Rust 后端获取
        return await invoke<string | null>(STORAGE_COMMANDS.GET, { key });
      } else {
        // 纯网页环境：使用 store2 的 sessionStorage
        return store.session.get(key) ?? null;
      }
    } catch (error: any) {
      console.error(`获取会话存储值失败 [${key}]:`, error);
      return null;
    }
  }

  // 设置值
  public async set(key: string, value: unknown): Promise<void> {
    try {
      if (IS_TAURI) {
        // 更新 Rust 后端
        await invoke(STORAGE_COMMANDS.SET, { key, value });
      } else {
        // 纯网页环境：使用 store2 的 sessionStorage
        store.session.set(key, value);
      }
    } catch (error: any) {
      console.error(`设置会话存储值失败 [${key}]:`, error);
    }
  }

  // 移除值
  public async remove(key: string): Promise<void> {
    try {
      if (IS_TAURI) {
        // 从 Rust 后端移除
        await invoke(STORAGE_COMMANDS.REMOVE, { key });
      } else {
        // 纯网页环境：使用 store2 的 sessionStorage
        store.session.remove(key);
      }
    } catch (error: any) {
      console.error(`移除会话存储值失败 [${key}]:`, error);
    }
  }

  // 清空所有值
  public async clear(): Promise<void> {
    try {
      if (IS_TAURI) {
        // 清空 Rust 后端
        await invoke(STORAGE_COMMANDS.CLEAR);
      } else {
        // 纯网页环境：使用 store2 的 sessionStorage
        store.session.clear();
      }
    } catch (error: any) {
      console.error('清空会话存储失败:', error);
    }
  }

  // 获取所有键
  public async keys(): Promise<string[]> {
    try {
      if (IS_TAURI) {
        // 从 Rust 后端获取所有键
        return await invoke<string[]>(STORAGE_COMMANDS.KEYS);
      } else {
        // 纯网页环境：使用 store2 的 sessionStorage
        return store.session.keys();
      }
    } catch (error: any) {
      console.error('获取会话存储键失败:', error);
      return [];
    }
  }

  // 获取长度
  public async length(): Promise<number> {
    try {
      // 通过获取 keys 数组的长度来计算
      const keys = await this.keys();
      return keys.length;
    } catch (error: any) {
      console.error('获取会话存储长度失败:', error);
      return 0;
    }
  }
}

// 创建单例实例 - 构造函数中已自动初始化
const tauriSessionStorage = new TauriSessionStorage();

// 同时支持默认导出和命名导出，保持与现有代码的兼容性
export default tauriSessionStorage;
export { tauriSessionStorage };
