package com.ruoyi.common.utils.asPose;

import cn.hutool.core.util.ObjectUtil;
import com.aspose.words.*;
import org.springframework.util.CollectionUtils;

import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Author fuzhilin
 * @Date 2021/12/2 0002 9:41
 * @Description
 */
public class ReplaceAndInsertTable implements IReplacingCallback {
    private String key;
    private GenerateTableVO tableVO;

    public ReplaceAndInsertTable(String key, GenerateTableVO tableVO) {
        this.key = key;
        this.tableVO = tableVO;
    }

    @Override
    public int replacing(ReplacingArgs e) throws Exception {
        //获取当前节点
        Node currentNode = e.getMatchNode();
        //节点拆分处理当前匹配字段
        splitRun(currentNode, e.getMatchOffset());
        //获取当前文档
        Document document = (Document) currentNode.getDocument();
        DocumentBuilder builder = new DocumentBuilder(document);
        //将光标移动到指定节点
        builder.moveTo(currentNode);
        Table table = builder.startTable();

        // 表头
        List<String> title = tableVO.getTitle();
        List<List<String>> values = tableVO.getValues();

        double width = tableVO.getWidth();

        // 添加表头
        //table.getRows().add(createRow(title.size(), title.toArray(new String[title.size()]), document, true));
        addTableHeader(builder,title);
        // 添加参数值
        for (int i = 0; i < values.size(); i++) {
            List<String> value = values.get(i);
            if (value != null && !value.isEmpty()) {
                table.getRows().add(createRow(value.size(), value.toArray(new String[value.size()]), document, false));
            }
        }
        if (ObjectUtil.isNotNull(tableVO.getLine())){
            Row targetRow = table.getRows().get(tableVO.getLine());
            for (Cell cell : targetRow.getCells()) {
                cell.getCellFormat().getShading().setBackgroundPatternColor(new Color(179, 202, 229));
            }
        }
        //如果不为空 说明需要合并
        if (!CollectionUtils.isEmpty(tableVO.getMergeTableParamList())) {
            AsposeUtil.MergeSpecifiedCells(document, tableVO.getMergeTableParamList());
        }
        if (0 != width) {
            table.setPreferredWidth(PreferredWidth.fromPoints(width));
        }
        return ReplaceAction.SKIP;
    }

    /**
     * 添加表头
     */
    private static void addTableHeader(DocumentBuilder builder, List<String> headers) throws Exception {
        //段落的对齐方式设置为居中对齐
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);/**居中***/
        //方法将清除单元格的所有格式设置，包括字体、颜色、边框等。如果您只想清除特定的格式设置，可以使用其他适当的方法，例如clearFormatting()方法的重载版本，该版本接受一个参数，用于指定要清除的格式设置类型。
        builder.getCellFormat().clearFormatting();
        //设置单元格的宽度  磅（points）。
        builder.getCellFormat().setWidth(70.0);
        //这只单元格的高度  磅（points）。
        builder.getRowFormat().setHeight(25.0);
        //设置单元格垂直
        builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
        //单元格背景颜色设置
        builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(179, 202, 229));
        //单元格边框颜色设置
        builder.getRowFormat().getBorders().setColor(new Color(1, 1, 1));
        //设置字体颜色
        builder.getFont().setColor(new Color(1, 1, 1));
        //这行代码禁用单元格中的文本自动换行功能
        builder.getCellFormat().setWrapText(false);
        //这行代码启用单元格中文本的自动缩放以适应单元格大小。
        //builder.getCellFormat().setFitText(true);
        //这行代码设置行的高度规则为精确值。
        //builder.getRowFormat().setHeightRule(HeightRule.EXACTLY);
        //这行代码设置行的边框线样式为浮雕3D效果。
        //builder.getRowFormat().getBorders().setLineStyle(LineStyle.ENGRAVE_3_D);
        for (String header : headers) {
            builder.insertCell();
            builder.write(header);
        }
        builder.endRow();
    }

    /**
     * 创建列
     *
     * @param value
     * @param doc
     * @return
     */
    static Cell createCell(String value, Document doc, boolean isHeader) {
        Cell c1 = new Cell(doc);
        Paragraph p = new Paragraph(doc);
        Run r = new Run(doc, value);
        r.getFont().setName("仿宋GB2312");
        r.getFont().setSize(14);
        if (isHeader||"筛查内容".equals(value)) {
            if("学生姓名".equals(value)){
                r.getFont().setBold(false);
            }else{
                r.getFont().setBold(true);
            }
        } else {
            r.getFont().setBold(false);
        }
        p.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
        p.appendChild(r);
        c1.appendChild(p);
        return c1;
    }

    /**
     * 创建行
     *
     * @param columnCount
     * @param columnValues
     * @param doc
     * @return
     */
    static Row createRow(int columnCount, String[] columnValues, Document doc, boolean isHeader) {
        Row r2 = new Row(doc);
        /*r2.getRowFormat().setTopPadding(5d);
        r2.getRowFormat().setBottomPadding(5d);*/
        for (int i = 0; i < columnCount; i++) {
            if (columnValues.length > i) {
                Cell cell = createCell(columnValues[i], doc, isHeader);
                r2.getCells().add(cell);
                cell.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
            } else {
                Cell cell = createCell("", doc, isHeader);
                r2.getCells().add(cell);
                cell.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
            }

        }
        return r2;
    }

    /**
     * 替换参数位置
     *
     * @param currentNode
     * @param position
     */
    private void splitRun(Node currentNode, int position) {
        String text = currentNode.getText();
        Node newNode = currentNode.deepClone(true);
        if (text.length() >= position + this.key.length()) {
            ((Run) currentNode).setText(text.substring(position + this.key.length()));
        } else {
            int morlength = position + this.key.length() - text.length();
            ((Run) currentNode).setText("");
            Node tmpnode = currentNode;
            for (int i = 0; i < this.key.length(); i++) {
                tmpnode = tmpnode.getNextSibling();
                String tmptext = tmpnode.getText();
                if (tmptext.length() >= morlength) {
                    ((Run) tmpnode).setText(tmptext.substring(morlength));
                    break;
                } else {
                    morlength = morlength - tmptext.length();
                    ((Run) tmpnode).setText("");
                }
            }
        }
        if (position > 0) {
            ((Run) newNode).setText(text.substring(0, position));
            currentNode.getParentNode().insertBefore(newNode, currentNode);
        }
    }

    /**
     * 设置表体的格式
     */
    public static void setTableBodyFormat(DocumentBuilder builder) throws Exception {
        //清除格式
        builder.getCellFormat().clearFormatting();
        //设置单元格垂直
        builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
        //单元格背景颜色设置
        builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(253, 253, 253, 255));
        //单元格边框颜色设置
        builder.getRowFormat().getBorders().setColor(new Color(1, 1, 1));
        //设置字体颜色
        builder.getFont().setColor(new Color(1, 1, 1));
        //这行代码禁用单元格中的文本自动换行功能
        builder.getCellFormat().setWrapText(false);
    }

    public static void main(String[] args) throws Exception {
        GenerateTableVO generateTableVO = new GenerateTableVO();
        generateTableVO.setTitle(Arrays.asList("", "心理健康状况不佳", "心理健康状况不佳"));
        ArrayList<List<String>> lists = new ArrayList<>();
        lists.add(Arrays.asList("", "人数", "占比"));
        lists.add(Arrays.asList("小学", "75", "12%"));
        lists.add(Arrays.asList("初中", "65", "11%"));
        lists.add(Arrays.asList("大学", "122", "23%"));
        generateTableVO.setValues(lists);
        ArrayList<MergeTableParamVO> mergeTableParamVOS = new ArrayList<>();
        MergeTableParamVO paramVO = new MergeTableParamVO();
        paramVO.setBorderType(BorderType.DIAGONAL_DOWN);
        mergeTableParamVOS.add(new MergeTableParamVO().setStartLine(0).setStartColumn(0).setEndLine(1).setEndColumn(0));
        mergeTableParamVOS.add(new MergeTableParamVO().setStartLine(0).setStartColumn(1).setEndLine(0).setEndColumn(2));
        generateTableVO.setMergeTableParamList(mergeTableParamVOS);


        // 实例化一个document对象
        Document document = new Document();
        // 创建一个DocumentBuilder类的对象，并使用Document对象对其进行初始化
        DocumentBuilder builder = new DocumentBuilder(document);
        // 表头
        List<String> title = generateTableVO.getTitle();
        List<List<String>> values = generateTableVO.getValues();
        Table table = builder.startTable();
        // 添加表头
        //table.getRows().add(createRow(title.size(), title.toArray(new String[title.size()]), document, true));
        addTableHeader(builder,title);
        // 添加参数值
        for (int i = 0; i < values.size(); i++) {
            List<String> value = values.get(i);
            if (value != null && !value.isEmpty()) {
                table.getRows().add(createRow(value.size(), value.toArray(new String[value.size()]), document, false));
            }
        }
        Row targetRow = table.getRows().get(1);
        for (Cell cell : targetRow.getCells()) {
            cell.getCellFormat().getShading().setBackgroundPatternColor(Color.YELLOW);
        }
        //如果不为空 说明需要合并
        if (!CollectionUtils.isEmpty(generateTableVO.getMergeTableParamList())) {
            AsposeUtil.MergeSpecifiedCells(document, generateTableVO.getMergeTableParamList());
        }
        document.save("D://saveFile//合并//hebing1.docx");
    }
}
