//! 窗口工具模块
//!
//! 提供窗口相关的实用函数，包括动画和位置计算等功能。

use super::WindowLabel;
use tauri::{AppHandle, Manager, Runtime};

/**
 * 显示指定标签的窗口，如果窗口已存在则将其打开。
 */
pub fn show_windows_by_label<R: Runtime>(app: &AppHandle<R>, window_label: WindowLabel) -> bool {
    // 检查是否已存，如果存在则直接打开
    let label = window_label.as_ref();
    let window = app.get_webview_window(label);

    if let Some(existing_window) = window {
        if let Ok(visible) = existing_window.is_visible()
            && !visible
        {
            let _ = existing_window.show();
        }
        if let Ok(minimized) = existing_window.is_minimized()
            && minimized
        {
            let _ = existing_window.unminimize();
        }
        if let Ok(focused) = existing_window.is_focused()
            && !focused
        {
            let _ = existing_window.set_focus();
        }
        return true;
    }

    false
}

/// 检查窗口是否可见且未最小化
#[allow(dead_code)]
pub fn check_window_visible<R: Runtime>(app: &AppHandle<R>, window_label: WindowLabel) -> bool {
    let label = window_label.as_ref();
    if let Some(window) = app.get_webview_window(label) {
        // 检查窗口是否可见
        let is_visible = window.is_visible().unwrap_or(false);

        // 如果窗口不可见，直接返回false
        if !is_visible {
            return false;
        }

        // 检查窗口是否最小化
        let is_minimized = window.is_minimized().unwrap_or(false);

        // 窗口可见且未最小化才认为是真正可见
        is_visible && !is_minimized
    } else {
        false
    }
}

/// 获取显示器，优先使用main窗口所在显示器，回退到主显示器
pub fn get_monitor_for_window<R: Runtime>(app: &AppHandle<R>) -> Result<tauri::Monitor, String> {
    if let Some(main_window) = app.get_webview_window(WindowLabel::MAIN.as_ref()) {
        // 尝试获取主窗口所在的显示器
        let Ok(Some(monitor)) = main_window.current_monitor() else {
            return Err("未找到主窗口显示器".to_string());
        };
        Ok(monitor)
    } else {
        // 主窗口未打开，获取主显示器
        let Ok(Some(monitor)) = app.primary_monitor() else {
            return Err("未找到主显示器".to_string());
        };
        Ok(monitor)
    }
}
