package com.bonus.material.utils;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 构建指定文件夹结构的 ZIP 工具类（适配 HttpServletResponse 输出）
 */
public class FolderZipUtil {

    /**
     * 生成仅包含指定文件夹结构的空 ZIP 包（直接输出到响应流）
     *
     * @param response    HTTP 响应对象
     * @param zipFileName 下载的 ZIP 文件名
     * @param folderPaths 目标文件夹路径列表（如：["docs/", "docs/img/"]）
     */
    public static void buildEmptyFolderZip(HttpServletResponse response, String zipFileName, List<String> folderPaths) {
        try {
            // 1. 设置响应头（解决中文文件名乱码 + 触发下载）
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("UTF-8");
            // 编码文件名，适配不同浏览器
            String encodedFileName = URLEncoder.encode(zipFileName, StandardCharsets.UTF_8.name())
                    .replaceAll("\\+", "%20");
            response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
            // 禁止缓存
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);

            // 2. 直接通过响应流构建 ZIP（无内存缓存）
            try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8)) {
                // 遍历文件夹路径，创建空文件夹条目
                for (String folderPath : folderPaths) {
                    // 确保文件夹路径以 / 结尾（ZIP 中 / 结尾表示文件夹）
                    String normalizedPath = folderPath.endsWith("/") ? folderPath : folderPath + "/";
                    ZipEntry folderEntry = new ZipEntry(normalizedPath);
                    zipOut.putNextEntry(folderEntry);
                    zipOut.closeEntry(); // 空文件夹无需写入内容，直接关闭条目
                }
                zipOut.flush(); // 刷新流，确保内容输出
            }
        } catch (Exception e) {
            // 异常时返回 500 状态码
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace();
        }
    }
}