package com.rongwei.sfcommon.sys.service.impl;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * word相关工具类
 *
 * @author rongwie
 */
@Component
public class WordExportUtil {
    private static final Logger logger = LoggerFactory.getLogger(WordExportUtil.class);

    private Configuration configuration;


    public WordExportUtil() {
        configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        configuration.setDefaultEncoding("UTF-8");
    }

    /**
     * 根据Doc模板生成word文件
     *
     * @param dataMap  Map 需要填入模板的数据
     * @param
     * @param fileName 要生成的文件的名称
     */
    public void createDoc(Map<String, Object> dataMap, String msg, String fileName) {
        // 1.生成文件的保存路径，暂时是固定的：位于项目路径下wordExport文件夹中
        String saveFolderPath = null;
        saveFolderPath = "/fileExport/";
        logger.info("saveFolderPath: " + saveFolderPath);
        File filePath = new File(saveFolderPath);
        // 1.1若对应路径不存在，则创建此路径
        if (!filePath.exists()) {
            filePath.mkdirs();
        }

        // 2.生成word
        this.createDoc(dataMap, msg, saveFolderPath, fileName);
    }

    /**
     * 根据Doc模板生成word文件
     *
     * @param dataMap        Map 需要填入模板的数据
     * @param pathPrefix     所在项目或jar中模板路径，比如当前模板在jar中路径为：/BOOT-INF/classes/filetime/，而在开发环境：/filetime/
     * @param saveFolderPath 要生成文件的保存路径,要确保路径存在
     * @param fileName       要生成的文件的名称
     */
    public void createDoc(Map<String, Object> dataMap, String pathPrefix, String msg, String saveFolderPath, String fileName) {
        // 1.用于在保存路径创建 fileName.doc的空文档
        Writer out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(saveFolderPath + fileName), StandardCharsets.UTF_8));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // 2.生成word
        this.createDoc(dataMap, pathPrefix, msg, out);
    }

    /**
     * 根据Doc模板生成word文件
     *
     * @param dataMap        Map 需要填入模板的数据
     * @param saveFolderPath 要生成文件的保存路径,要确保路径存在
     * @param fileName       要生成的文件的名称
     */
    public void createDoc(Map<String, Object> dataMap, String msg, String saveFolderPath, String fileName) {
        // 1.用于在保存路径创建 fileName.doc的空文档
        Writer out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(saveFolderPath + fileName), StandardCharsets.UTF_8));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // 2. 所在项目或jar中模板路径，比如当前模板在jar中路径为：/BOOT-INF/classes/filetime/，而在开发环境：/filetime/
        String pathPrefix = "";

        // 为了支持能从execute jar 中获取模板文件
//		URI uri = null;
//		try
//		{
//			uri = ClassUtils.getDefaultClassLoader().getResource("").toURI();
//		}
//		catch (URISyntaxException e)
//		{
//			e.printStackTrace();
//		}
//		if (uri.getScheme().equals("jar"))
//		{
//			pathPrefix = "/BOOT-INF/classes/fileitem";
//		}

        // 3.生成word
        this.createDoc(dataMap, pathPrefix, msg, out);

        // 4.转成pdf
        //WordToPdfUtil.wordToPdf2(fileName, fileName + ".pdf");
    }

    /**
     * 根据Doc模板生成word文件
     *
     * @param dataMap    Map 需要填入模板的数据
     * @param pathPrefix 所在项目或jar中模板路径，比如当前模板在jar中路径为：/BOOT-INF/classes/filetime/，而在开发环境：/filetime/
     * @param out        输出
     */
    public void createDoc(Map<String, Object> dataMap, String pathPrefix, String msg, Writer out) {
        logger.info("要输出到word中的数据：" + dataMap);
        logger.info("xml模板文件名称templateFileName：");

        try {
            // 加载模板文件夹路径

            // 1.1 获取绝对路径中文件
//			FileTemplateLoader templateLoader = new FileTemplateLoader(new File(templateFolderPath));
            // 1.2 获取开发环境resource或jar中resource路径中文件
            //	configuration.setClassForTemplateLoading(this.getClass(), pathPrefix);
            pathPrefix = msg;
            configuration.setDefaultEncoding("utf-8");
            String[] split = pathPrefix.split("\\\\");
            String s = split[split.length - 1];
            String s1 = pathPrefix.substring(0, pathPrefix.length() - s.length());
            System.out.println(s1);
            configuration.setDirectoryForTemplateLoading(new File(s1));
            // 设置对象包装器
            configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));

            // 设置异常处理器
            configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            // 模板文件名称
            // 加载需要装填的模板
            Template template = configuration.getTemplate(s);
            // 输出文档
            template.process(dataMap, out);
            out.close();
            logger.info("word 导出成功");
        } catch (Exception e) {
            logger.info("word 导出报错：" + e.getMessage());
        }
    }

    //获得图片的base64码
    public String getImageBase(String src) throws Exception {
        if (src == null || src == "") {
            return "";
        }
        File file = new File(src);
        if (!file.exists()) {
            return "";
        }
        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(file);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);
    }

}
