package com.ruoyi.web.util;

import com.google.common.collect.Lists;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.web.domain.MultipleWayReportDto;
import org.apache.commons.io.IOUtils;
import org.springframework.http.MediaType;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MultiplyWayExporter {
    private static String linePrefixRed = "<w:p w:rsidR=\"00620458\" w:rsidRDefault=\"00C5790A\"><w:pPr><w:rPr><w:color w:val=\"FF0000\"/><w:szCs w:val=\"21\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:color w:val=\"FF0000\"/><w:szCs w:val=\"21\"/></w:rPr><w:t>";
    private static String linePrefixBlue = "<w:p w:rsidR=\"00620458\" w:rsidRDefault=\"00C5790A\"><w:pPr><w:rPr><w:color w:val=\"006400\"/><w:szCs w:val=\"21\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:color w:val=\"006400\"/><w:szCs w:val=\"21\"/></w:rPr><w:t>";
    private static String lineSuffix = "</w:t></w:r></w:p>";

    public static void export(HttpServletResponse response, MultipleWayReportDto rp, Map<String, String> variableMap) {
        if (response == null) {
            response.setStatus(404);
            return;
        }
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            String realFileName = rp.getContent().getFormId() + "_" + sdf.format(new Date()) + ".docx";

            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, realFileName);
            String text = IOUtils.toString(MultiplyWayExporter.class.getResourceAsStream("/templates/multiply_way_report.xml"), "utf8");
            String newText = replaceVarValue(text, variableMap);
            // OutputStream os = new FileOutputStream("D:\\data\\wish_output.xls");
            PrintWriter pw = new PrintWriter(response.getOutputStream());
            pw.write(newText);
            pw.flush();
        } catch (UnsupportedEncodingException e) {
            response.setStatus(404);
        } catch (IOException e) {
            response.setStatus(404);
        }
        return;
    }

    public static String getTableRow(String phase, String month, String event, String note) {
        return "<w:tr> <w:tblPrEx> <w:tblBorders> <w:top w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/> <w:left w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/> <w:bottom w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/> <w:right w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/> <w:insideH w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/> <w:insideV w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/> </w:tblBorders> <w:tblCellMar> <w:top w:w=\"0\" w:type=\"dxa\"/> <w:left w:w=\"108\" w:type=\"dxa\"/> <w:bottom w:w=\"0\" w:type=\"dxa\"/> <w:right w:w=\"108\" w:type=\"dxa\"/> </w:tblCellMar> </w:tblPrEx> <w:tc> <w:tcPr> <w:tcW w:w=\"720\" w:type=\"dxa\"/> </w:tcPr> <w:p> <w:pPr> <w:rPr> <w:rFonts w:hint=\"default\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:hint=\"eastAsia\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> <w:t>"
                + phase + "</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w=\"1230\" w:type=\"dxa\"/> </w:tcPr> <w:p> <w:pPr> <w:rPr> <w:rFonts w:hint=\"default\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:hint=\"eastAsia\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> <w:t>"
                + month + "</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w=\"2070\" w:type=\"dxa\"/> </w:tcPr> <w:p> <w:pPr> <w:rPr> <w:rFonts w:hint=\"default\" w:eastAsiaTheme=\"minorEastAsia\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:hint=\"eastAsia\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> <w:t>"
                + event + "</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w=\"5265\" w:type=\"dxa\"/> </w:tcPr> <w:p> <w:pPr> <w:rPr> <w:rFonts w:hint=\"default\" w:eastAsiaTheme=\"minorEastAsia\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:hint=\"eastAsia\"/> <w:sz w:val=\"21\"/> <w:szCs w:val=\"21\"/> <w:vertAlign w:val=\"baseline\"/> <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/> </w:rPr> <w:t>"
                + note + "</w:t> </w:r> </w:p> </w:tc> </w:tr>";
    }

    public static String getTextLine(Boolean valid, List<String> textList) {
        List<String> linesList = Lists.newArrayList();
        String prefix = valid ? linePrefixBlue : linePrefixRed;
        if (valid) {
            for (String text : textList) {
                linesList.add(prefix + text + lineSuffix);
            }
        } else {
            for (String text : textList) {
                linesList.add(prefix + (linesList.size() + 1) + ". " + text + lineSuffix);
            }
        }
        return StringUtils.join(linesList, ",");
    }

    private static String replaceVarValue(String text, Map<String, String> valueMap) {
        String pattern = "(\\$\\{(.+?)\\})";
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            String key = m.group(1);
            String vk = key.substring(2, key.length() - 1);
            String value = valueMap.get(vk);
            m.appendReplacement(sb, null == value ? "" : value);
        }
        m.appendTail(sb);
        return sb.toString();
    }
}
