package vip.xiaonuo.coldchain.core.renke.util;

import lombok.extern.slf4j.Slf4j;

import java.io.*;

/**
 * @author jackzhou
 * @version 1.0
 * @project jfcloud-coldchain
 * @description 工具类：从 JAR 中拷贝 param.dat 文件到 JAR 所在目录
 * @date 2024/11/17 08:47:50
 */
@Slf4j
public class ParamFileUtil {
    static final String DEFAULT_NAME = "param.dat";
    final static String resourcePath = "lib/param.dat";

    private ParamFileUtil() {
        // 私有构造函数，防止外部实例化
    }

    public static String copyParamDatFileFromJarToCurrentDirectory() {
        try {
            return copyParamDatFileFromJarToCurrentDirectory(DEFAULT_NAME);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 从 JAR 文件中的指定资源路径拷贝文件到当前工作目录。
     * 如果目标文件已存在，则不进行拷贝，并返回目标文件的绝对路径。
     *
     * @param targetFileName 目标文件名（将拷贝到当前工作目录）
     * @return 新文件的绝对路径，如果文件已存在则返回该文件的路径
     * @throws IOException 如果文件操作出错
     */
    public static String copyParamDatFileFromJarToCurrentDirectory(String targetFileName) throws IOException {
        // 获取资源的输入流
        InputStream inputStream = ParamFileUtil.class.getClassLoader().getResourceAsStream(resourcePath);
        if (inputStream == null) {
            throw new FileNotFoundException("资源文件 " + resourcePath + " 未找到！");
        }

        // 获取当前工作目录 (用户启动 JAR 文件的目录)
        String currentDirectory = System.getProperty("user.dir"); // 获取当前工作目录

        // 目标文件的路径
        File targetFile = new File(currentDirectory, targetFileName);

        // 如果目标文件已存在，则不拷贝，直接返回文件的绝对路径
        if (targetFile.exists()) {
            log.info("param.dat 文件已存在，跳过拷贝操作: {}", targetFile.getAbsolutePath());
            inputStream.close();  // 关闭输入流
            return targetFile.getAbsolutePath();  // 返回目标文件的绝对路径
        }

        // 创建目标文件的输出流
        try (OutputStream outputStream = new FileOutputStream(targetFile)) {
            byte[] buffer = new byte[1024];
            int bytesRead;

            // 从 JAR 文件中的输入流读取并写入到目标文件
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            log.info("param.dat 文件已成功拷贝到工作目录: {}", targetFile.getAbsolutePath());
            return targetFile.getAbsolutePath();  // 返回新文件的绝对路径
        } finally {
            // 关闭输入流
            inputStream.close();
        }
    }

}
