package pwc.taxtech.atms.service.impl;

import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.util.JxlsHelper;
import org.nutz.lang.Lang;
import org.nutz.lang.Streams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class CommonDocumentHelper {
    private static final Logger logger = LoggerFactory.getLogger(CommonDocumentHelper.class);

    public void toXlsxFileUsingJxls(List<?> list, String excelTemplatePathInClassPath, String outputFilePath) {
        //InputStream is = Streams.fileIn(excelTemplatePathInClassPath);
        InputStream is =  this.getClass().getResourceAsStream(excelTemplatePathInClassPath);
        OutputStream os = Streams.fileOut(outputFilePath);
        Context context = new Context();
        context.putVar("list", list);
        context.putVar("REPORT_DATE", new Date());
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer = jxlsHelper.createTransformer(is, os);
        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig()
                .getExpressionEvaluator();

        // evaluator.getJexlEngine().setSilent(true); // 设置静默模式,不报警告
        Map<String, Object> funcs = new HashMap<String, Object>();
        funcs.put("myutils", new JxlsUtils());
        evaluator.getJexlEngine().setFunctions(funcs);
        // jxlsHelper.setUseFastFormulaProcessor(false); //与统计函数有关
        try {
            jxlsHelper.processTemplate(context, transformer);
        } catch (IOException e) {
            logger.error("error when calling processTemplate:" + e, e);
            throw Lang.wrapThrow(e);
        } finally {
            Streams.safeClose(is);
            Streams.safeClose(os);
        }
    }
    public OutputStream toXlsxFileUsingJxls(Object header, List<?> list, String excelTemplatePathInClassPath) {
        //InputStream is = Streams.fileIn(excelTemplatePathInClassPath);
        InputStream is =  this.getClass().getResourceAsStream(excelTemplatePathInClassPath);
        OutputStream os = new ByteArrayOutputStream();
        Context context = new Context();
        context.putVar("header", header);
        context.putVar("list", list);
        context.putVar("REPORT_DATE", new Date());
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer = jxlsHelper.createTransformer(is, os);
        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig()
                .getExpressionEvaluator();
        // evaluator.getJexlEngine().setSilent(true); // 设置静默模式,不报警告
        Map<String, Object> funcs = new HashMap<String, Object>();
        funcs.put("myutils", new JxlsUtils());
        evaluator.getJexlEngine().setFunctions(funcs);
        // jxlsHelper.setUseFastFormulaProcessor(false); //与统计函数有关
        try {
            jxlsHelper.processTemplate(context, transformer);
        } catch (IOException e) {
            logger.error("error when calling processTemplate:" + e, e);
            throw Lang.wrapThrow(e);
        } finally {
            Streams.safeClose(is);
            Streams.safeClose(os);
        }
        return os;
    }

    public OutputStream toXlsxFileUsingJxls(List<?> list, String excelTemplatePathInClassPath) {
        //InputStream is = Streams.fileIn(excelTemplatePathInClassPath);
        InputStream is =  this.getClass().getResourceAsStream(excelTemplatePathInClassPath);
        OutputStream os = new ByteArrayOutputStream();
        Context context = new Context();
        context.putVar("list", list);
        context.putVar("REPORT_DATE", new Date());
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer = jxlsHelper.createTransformer(is, os);
        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig()
                .getExpressionEvaluator();
        // evaluator.getJexlEngine().setSilent(true); // 设置静默模式,不报警告
        Map<String, Object> funcs = new HashMap<String, Object>();
        funcs.put("myutils", new JxlsUtils());
        evaluator.getJexlEngine().setFunctions(funcs);
        // jxlsHelper.setUseFastFormulaProcessor(false); //与统计函数有关
        try {
            jxlsHelper.processTemplate(context, transformer);
        } catch (IOException e) {
            logger.error("error when calling processTemplate:" + e, e);
            throw Lang.wrapThrow(e);
        } finally {
            Streams.safeClose(is);
            Streams.safeClose(os);
        }
        return os;
    }

}