use super::SessionStorage;
use tauri::{AppHandle, Emitter, EventTarget, State, Window};

// 获取会话存储的值
#[tauri::command]
pub fn session_storage_get(key: String, storage: State<SessionStorage>) -> Option<serde_json::Value> {
    storage.get(&key).and_then(|result| result.ok())
}

// 设置会话存储的值
#[tauri::command]
pub fn session_storage_set(key: String, value: serde_json::Value, storage: State<SessionStorage>, app: AppHandle, window: Window) -> bool {
    let result = storage.set(&key, &value).is_ok();
    if result
        && let Err(e) = app.emit_filter("session_storage_changed", (key, &value), |target| {
            match target {
                // 只有当窗口的 label 不是调用窗口的 label 时，才发送事件
                EventTarget::WebviewWindow { label } => label != window.label(),
                _ => false,
            }
        }) {
            log::warn!("发送存储变更事件失败: {}", e);
        }
    result
}

// 从会话存储中移除值
#[tauri::command]
pub fn session_storage_remove(key: String, storage: State<SessionStorage>, app: AppHandle, window: Window) -> bool {
    let result = storage.remove(&key);
    if result {
        // 向除调用窗口外的所有窗口发送数据删除事件
        if let Err(e) = app.emit_filter("session_storage_removed", key, |target| {
            match target {
                // 只有当窗口的 label 不是调用窗口的 label 时，才发送事件
                EventTarget::WebviewWindow { label } => label != window.label(),
                _ => false,
            }
        }) {
            log::warn!("发送存储删除事件失败: {}", e);
        }
    }
    result
}

// 清空会话存储
#[tauri::command]
pub fn session_storage_clear(storage: State<SessionStorage>, app: AppHandle, window: Window) -> bool {
    storage.clear();
    // 向除调用窗口外的所有窗口发送清空事件
    if let Err(e) = app.emit_filter("session_storage_cleared", (), |target| {
        match target {
            // 只有当窗口的 label 不是调用窗口的 label 时，才发送事件
            EventTarget::WebviewWindow { label } => label != window.label(),
            _ => false,
        }
    }) {
        log::warn!("发送存储清空事件失败: {}", e);
    }
    true
}

// 获取所有会话存储键
#[tauri::command]
pub fn session_storage_keys(storage: State<SessionStorage>) -> Vec<String> {
    storage.keys()
}

// 检查会话存储中是否存在指定键
#[tauri::command]
pub fn session_storage_has(key: String, storage: State<SessionStorage>) -> bool {
    storage.has(&key)
}
