package com.ecep.contract;

import java.io.File;
import java.io.IOException;
import java.util.function.Consumer;

import org.springframework.util.StringUtils;

public class DesktopUtils {

    /**
     * 在默认浏览器中打开指定的URL。
     * <p>
     * 该函数使用JavaFX的HostServices类来调用系统默认的浏览器，并打开传入的URL。
     *
     * @param url 要在浏览器中打开的URL字符串。该参数不能为空，且应为有效的URL格式。
     */
    public static void showInBrowse(String url) {
        Desktop.instance.getHostServices().showDocument(url);
    }

    /**
     * 在系统的文件资源管理器中打开指定的文件夹。
     * <p>
     * 该方法首先尝试使用 java.awt.Desktop API 打开文件夹。如果该 API 不支持，
     * 则在 Windows 系统中使用 explorer.exe 打开文件夹。
     *
     * @param dir 要打开的文件夹对象。如果为 null 或无效路径，可能会抛出异常。
     * @throws RuntimeException 如果使用 java.awt.Desktop 打开文件夹时发生 IOException，
     *                          则将其包装为 RuntimeException 抛出。
     */
    public static void showInExplorer(File dir) {
        if (java.awt.Desktop.isDesktopSupported()) {
            try {
                java.awt.Desktop.getDesktop().open(dir);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        } else {
            try {
                // 在Windows中使用explorer.exe打开文件夹，路径用双引号括起来
                Process process = Runtime.getRuntime().exec(
                        new String[] { "explorer.exe", "\"" + dir.getAbsolutePath() + "\"" }, null, new File("."));
                // process.waitFor();
            } catch (IOException e) {
                if (Desktop.logger.isDebugEnabled()) {
                    Desktop.logger.debug("Unable open {}", dir.getAbsolutePath(), e);
                }
            }
        }
    }

    public static void checkAndShowInExplorer(String path, Consumer<String> consumer) {
        if (!StringUtils.hasText(path)) {
            consumer.accept("文件/目录为空，无法打开");
            return;
        }
        File file = new File(path);
        if (!file.exists()) {
            if (file.isFile()) {
                consumer.accept("文件 " + file.getAbsolutePath() + " 不存在，请确认");
            } else {
                consumer.accept("目录 " + file.getAbsolutePath() + " 不存在，请确认");
            }
            return;
        }
    
        try {
            showInExplorer(file);
            consumer.accept("打开文件/目录 " + path);
        } catch (Exception e) {
            consumer.accept("打开文件错误：" + e.getMessage());
        }
    }

}
