package cn.iocoder.yudao.framework.velocity;

import cn.hutool.core.date.DateUtil;
import org.apache.commons.io.FileUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Component
public class VelocityHelper {

    private static VelocityEngine ve = new VelocityEngine();

    private static void initVelocityEngine(String path) {
//        ve.setProperty(VelocityEngine.RESOURCE_LOADER,VelocityEngine.RESOURCE_LOADER_CLASS);
//        ve.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");// 这是模板所在路径
        ve.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, path);// 这是模板所在路径
        ve.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
        ve.setProperty(Velocity.INPUT_ENCODING, "UTF-8");//指定编码格式，避免生成模板就造成乱码，影响到转pdf后的文件
        ve.init();
    }


    /**
     * 得到模板引擎渲染数据后的文件流
     *
     * @param templatePath 模板所在位置
     * @param out          得到输出流
     * @param param        模板数据k-y
     * @param dataList     模板数据集合
     * @return 流
     */
    public static Writer getWriterByTemplate(String templatePath, OutputStream out, Map<String, Object> param, List<Map<String, Object>> dataList) {

        File file = new File(templatePath);
        String path = file.getParent();

        initVelocityEngine(path);
        Template template = ve.getTemplate(file.getName(), "utf-8");
        VelocityContext ctx = new VelocityContext();
        ctx.put("param", param); // 数据键值对
        ctx.put("dataList", dataList); // 数据集合
        ctx.put("dateFormat", new DateUtil()); // 当前时间对象
        Writer bw;
        if (null != out)
            bw = new BufferedWriter(new OutputStreamWriter(out));
        else
            bw = new StringWriter();
        template.merge(ctx, bw);
        return bw;
    }

    /**
     * 得到模板引擎渲染数据后的文件流
     *
     * @param file    文件
     * @param out         得到输出流
     * @param param       模板数据k-y
     * @param dataList    模板数据集合
     * @return 流
     */
    public static Writer getWriterByTemplate(File file, OutputStream out, Map<String, Object> param, List<Map<String, Object>> dataList) throws IOException {

        String path = file.getParent();

        initVelocityEngine(path == null ? "" : path);
        Template template = ve.getTemplate(file.getName(), "utf-8");
        VelocityContext ctx = new VelocityContext();
        ctx.put("param", param); // 数据键值对
        ctx.put("dataList", dataList); // 数据集合
        ctx.put("dateFormat", new DateUtil()); // 当前时间对象
        Writer bw;
        if (null != out)
            bw = new BufferedWriter(new OutputStreamWriter(out));
        else
            bw = new StringWriter();
        template.merge(ctx, bw);
        return bw;
    }
}
