package com.njcn.product.event.report.utils;

import cn.afterturn.easypoi.word.WordExportUtil;
import cn.afterturn.easypoi.word.entity.MyXWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;

import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: cdf
 * @CreateTime: 2025-09-23
 * @Description:
 */
public class WordTemplate {

    public static void main(String[] args) throws Exception {
        // 模板文件路径
        // 1. 处理模板路径并获取输入流
//        String temPath = getTemplateInputStream("template/bj_report.docx");
//        if (temPath == null) {
//            throw new FileNotFoundException("模板文件不存在: template/bj_report.docx");
//        }
//        // 准备数据
//        Map<String, Object> map = new HashMap<>();
//        map.put("title", "用户信息表");
//        map.put("userList", getUsersData()); // 假设getUsersData()方法返回用户数据列表
//        // 导出 Word 文档
//        XWPFDocument doc = WordExportUtil.exportWord07(temPath, map);
//        try (FileOutputStream outStream = new FileOutputStream("user_info.docx")) {
//            doc.write(outStream);
//        }
    }

    private static List<Map<String, String>> getUsersData() {
        // 返回模拟用户数据（实际需从数据库或其他数据源获取）
        return new ArrayList<>();
    }


    /**
     * 生成Word文档（响应到浏览器下载）
     *
     * @param templatePath 模板路径
     * @param response     HttpServletResponse
     * @param fileName     下载文件名（如“20250917电压暂降监测报告.docx”）
     * @param data         数据Map
     */
    public static void generateWordDownload(String templatePath, javax.servlet.http.HttpServletResponse response, String fileName, Map<String, Object> data) throws Exception {
        // 设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1"));
        response.setCharacterEncoding("UTF-8");
        // 1. 处理模板路径并获取输入流
        InputStream temPath = getTemplateInputStream(templatePath);
        if (temPath == null) {
            throw new FileNotFoundException("模板文件不存在: " + templatePath);
        }
        // 渲染文档并响应
        MyXWPFDocument document = new MyXWPFDocument (temPath);

       WordExportUtil.exportWord07(document, data);
        System.out.println("开始合并单元格");
        mergeTableCells(document);
        try (OutputStream outputStream = response.getOutputStream()) {
            document.write(outputStream);
        } catch (Exception e) {

        } finally {
            document.close();
        }
    }

    /**
     * 导出Word文档，带模板文件检查
     *
     * @param templatePath 模板文件路径（支持classpath路径和绝对路径）
     * @param data         导出数据
     * @param outputPath   输出文件路径
     * @throws IOException 当模板不存在或IO操作失败时抛出
     */
//    public static void exportWord(String templatePath, Map<String, Object> data, String outputPath) throws IOException {
//        // 1. 处理模板路径并获取输入流
//        String temPath = getTemplateInputStream(templatePath);
//        if (temPath == null) {
//            throw new FileNotFoundException("模板文件不存在: " + templatePath);
//        }
//
//        // 3. 写入输出文件
//        try (FileOutputStream outStream = new FileOutputStream(outputPath); XWPFDocument doc = WordExportUtil.exportWord07(temPath, data)) {
//            // 2. 导出Word文档
//            doc.write(outStream);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//    }
    /**
     * 手动合并表格单元格
     * 合并规则：相邻行中指定列的值相同时进行合并
     */
    private static void mergeTableCells(XWPFDocument doc) {
        // 获取文档中的所有表格
        List<XWPFTable> tables = doc.getTables();

        for (XWPFTable table : tables) {
            int rowCount = table.getNumberOfRows();
            if (rowCount <= 1) continue;

            // 定义需要合并的列索引（根据你的表格结构调整）
            int[] mergeColumns = {0}; // 第1列(姓名)和第2列(班级)需要合并

            for (int colIndex : mergeColumns) {
                mergeVerticalCells(table, colIndex);
            }
        }
    }

    /**
     * 垂直合并指定列的相同值单元格
     */
    private static void mergeVerticalCells(XWPFTable table, int colIndex) {
        int rowCount = table.getNumberOfRows();
        int mergeStartRow = -1;
        String previousValue = null;

        for (int i = 0; i < rowCount; i++) {
            XWPFTableRow row = table.getRow(i);
            if (row == null) continue;

            XWPFTableCell cell = row.getCell(colIndex);
            if (cell == null) continue;

            String currentValue = cell.getText();

            if (currentValue.equals(previousValue)) {
                // 值相同，继续合并区间
                if (mergeStartRow == -1) {
                    mergeStartRow = i - 1;
                }
                // 如果是最后一行，需要执行合并
                if (i == rowCount - 1) {
                    mergeCells(table, colIndex, mergeStartRow, i);
                }
            } else {
                // 值不同，合并之前的区间
                if (mergeStartRow != -1) {
                    mergeCells(table, colIndex, mergeStartRow, i - 1);
                    mergeStartRow = -1;
                }
                previousValue = currentValue;
            }
        }
    }

    /**
     * 执行单元格合并
     */
    private static void mergeCells(XWPFTable table, int colIndex, int startRow, int endRow) {
        if (startRow >= endRow) return;

        for (int i = startRow; i <= endRow; i++) {
            XWPFTableRow row = table.getRow(i);
            if (row != null) {
                XWPFTableCell cell = row.getCell(colIndex);
                if (cell != null) {
                    if (i == startRow) {
                        // 起始行设置合并属性
                        cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
                    } else {
                        // 后续行设置为继续合并
                        cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
                    }
                }
            }
        }
    }
    /**
     * 获取模板文件输入流（优先从classpath查找，再查找绝对路径）
     *
     * @param templatePath 模板路径
     * @return 输入流，若文件不存在则返回null
     */
    private static InputStream getTemplateInputStream(String templatePath) {
        // 1. 尝试从classpath资源加载（适用于Spring Boot项目的resources目录）
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        InputStream inputStream = classLoader.getResourceAsStream(templatePath);

        return inputStream;
    }
}
