package com.jeeplus.assess.invoice.utils.OMS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * ZIP打包工具类
 */
public class ZipUtils {
    private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);

    /**
     * 将指定文件夹打包为ZIP文件
     * @param sourceDir 待打包的文件夹路径（如：D:/attachment-file/KP-2026-301）
     * @param zipFilePath 生成的ZIP文件路径（如：D:/attachment-file/KP-2026-301.zip）
     * @throws IOException 打包异常
     */
    public static void zipFolder(String sourceDir, String zipFilePath) throws IOException {
        File sourceFile = new File(sourceDir);
        if (!sourceFile.exists() || !sourceFile.isDirectory()) {
            throw new IOException("待打包的文件夹不存在或不是目录：" + sourceDir);
        }

        // 创建ZIP输出流（指定UTF-8编码，避免文件名乱码）
        try (FileOutputStream fos = new FileOutputStream(zipFilePath);
             ZipOutputStream zos = new ZipOutputStream(fos, StandardCharsets.UTF_8)) {

            // 递归打包文件夹内所有文件
            File[] files = sourceFile.listFiles();
            if (files != null) {
                for (File file : files) {
                    zipFile(file, sourceFile.getName(), zos);
                }
            }
            logger.info("文件夹打包ZIP成功！源目录：{} → ZIP文件：{}", sourceDir, zipFilePath);
        } catch (IOException e) {
            logger.error("文件夹打包ZIP失败！", e);
            throw e;
        }
    }

    /**
     * 递归打包文件/子文件夹到ZIP
     * @param file 待打包的文件/文件夹
     * @param parentPath ZIP内的父路径（保持目录结构）
     * @param zos ZIP输出流
     * @throws IOException 打包异常
     */
    private static void zipFile(File file, String parentPath, ZipOutputStream zos) throws IOException {
        String entryName = parentPath + File.separator + file.getName();
        if (file.isDirectory()) {
            // 处理子文件夹：添加目录Entry，递归打包子文件
            zos.putNextEntry(new ZipEntry(entryName + File.separator));
            zos.closeEntry();

            File[] children = file.listFiles();
            if (children != null) {
                for (File child : children) {
                    zipFile(child, entryName, zos);
                }
            }
        } else {
            // 处理文件：写入ZIP
            try (FileInputStream fis = new FileInputStream(file);
                 BufferedInputStream bis = new BufferedInputStream(fis)) {

                zos.putNextEntry(new ZipEntry(entryName));
                byte[] buffer = new byte[4096];
                int len;
                while ((len = bis.read(buffer)) != -1) {
                    zos.write(buffer, 0, len);
                }
                zos.closeEntry();
            }
        }
    }

    /**
     * 删除文件夹（递归删除所有文件/子文件夹）
     * @param dir 待删除的文件夹
     * @return 是否删除成功
     */
    public static boolean deleteFolder(File dir) {
        if (!dir.exists()) {
            return true;
        }
        File[] files = dir.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    deleteFolder(file);
                } else {
                    file.delete();
                }
            }
        }
        boolean deleted = dir.delete();
        if (deleted) {
            logger.info("临时文件夹删除成功：{}", dir.getAbsolutePath());
        } else {
            logger.warn("临时文件夹删除失败：{}", dir.getAbsolutePath());
        }
        return deleted;
    }
}