package pwc.taxtech.atms.common.util;

import org.jxls.area.Area;
import org.jxls.builder.AreaBuilder;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.CellRef;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.WritableCellValue;
import org.jxls.transform.poi.WritableHyperlink;
import org.jxls.util.TransformerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import pwc.taxtech.atms.dto.export.ExportDto;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * Jxls导出Excel工具
 * author kevin
 */
public class JxlsUtils {
    private static final Logger log = LoggerFactory.getLogger(JxlsUtils.class);
    public  static String sheetName = "汇总表";

    public static void toPackageOs(HttpServletResponse response , String fileName) {
        ResponseUtil.response(response, fileName, null);
    }


    /**
     * 生成模板输入流
     * @param temPath
     * @return
     * @throws Exception
     */
    public static InputStream toPackageIn(String temPath){
        try {
            return new ClassPathResource((temPath)).getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  null;
    }


    public static <T> void export(ExportDto exportDto){
        toPackageOs(exportDto.getResponse(), exportDto.getFileName());
        try {
            exportExcel(exportDto.getList(), exportDto.getResponse().getOutputStream(), toPackageIn(exportDto.getTemplateUrl()), exportDto.getRelation(),exportDto.getSheetNameTemp());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static <T> void   exportExcel(List<T> list, ServletOutputStream os ,
                                         InputStream in, Object relation ){
        exportExcel( list,  os ,in,  relation , null);
    }
    public static <T> void   exportExcel(List<T> list, ServletOutputStream os ,
                                       InputStream in, Object relation, String sheetName1 ){
        String sn = sheetName;
        if(sheetName1 != null)
            sn = sheetName1;

        long exportExcelBegin = System.currentTimeMillis();
        log.warn("exportExcel begin: " + exportExcelBegin);
        Context context = new Context();
        context.putVar("list", list);
        if(relation != null) context.putVar("relation", relation);

        Map<String , Object> myFunction = new HashMap<String , Object>();

        myFunction.put("util", new JxlsUtils());

        Transformer trans = TransformerFactory.createTransformer(in, os);

        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) trans.getTransformationConfig().getExpressionEvaluator();

        evaluator.getJexlEngine().setFunctions(myFunction);

        //载入模板、处理导出

        AreaBuilder areaBuilder = new XlsCommentAreaBuilder(trans);

        List<Area> areaList = areaBuilder.build();
        //"汇总表!A1"

        areaList.get(0).applyAt(new CellRef( sn + "!A1"), context);

        try {
            trans.write();
            //释放资源

            os.flush();

            os.close();

            in.close();
            long endExcel = System.currentTimeMillis();
            log.warn("exportExcel begin: " + endExcel);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    //返回大的数

    public Integer max(Integer x , Integer y){

        return x > y ? x : y;

    }



    //给金额前面显示个货币符号

    public Object formatMoney(Object a){

        Object result = null;

        if(a != null){

            return "¥" + a;

        }

        return result;

    }



    //超链接

    public WritableCellValue myHyperlink(String address, String title) {

        return new WritableHyperlink(address, title);

    }




    private Map<String,Integer> countMap = new HashMap<>(); //用于jxls的foreach循环计数
    //为Excel添加序号
    public Integer count(String var){
        if (var == null) return null;
        if(countMap.containsKey(var)){
            Integer t = countMap.get(var);
            t += 1;
            countMap.replace(var,t);
            return t;
        }else{
            countMap.put(var,1);
        }
        return 1;
    }





}