package com.boco.nbd.wios.export;

import com.boco.nbd.cams.core.constant.CamsConstant;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import com.ihidea.core.util.DateUtilsEx;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.core.io.ClassPathResource;

import javax.servlet.http.HttpServletResponse;
import java.beans.PropertyDescriptor;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * poi工具类
 * 
 * @author xgl
 * @version [v1.6, 2019年4月2日]
 */
public class PoiUtil {
    
    public static HSSFWorkbook initExcel(String[][] titles, String fileName) {
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFCellStyle ztStyle = wb.createCellStyle();
        ztStyle.setAlignment(HorizontalAlignment.CENTER);
        ztStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        Font ztFont = wb.createFont();
        ztFont.setColor(Font.COLOR_NORMAL);
        ztFont.setFontHeightInPoints((short)14);
        ztFont.setBold(true);
        ztStyle.setFont(ztFont);
        
        HSSFSheet sheet = wb.createSheet();
        sheet.setDefaultColumnWidth(20);
        for (int j = 0; j < titles.length; j++) {
            HSSFRow headRow = sheet.createRow(j);
            for (int k = 0; k < titles[j].length; k++) {
                HSSFCell headRowCell = headRow.createCell(k);
                headRowCell.setCellStyle(ztStyle);
                headRowCell.setCellValue(titles[j][k]);
            }
        }
        if (fileName.startsWith("评价结果")) {
            CellRangeAddress region = new CellRangeAddress(0, 1, 0, 0);
            CellRangeAddress region1 = new CellRangeAddress(0, 1, 1, 1);
            CellRangeAddress region2 = new CellRangeAddress(0, 1, 2, 2);
            CellRangeAddress region3 = new CellRangeAddress(0, 1, 3, 3);
            CellRangeAddress region4 = new CellRangeAddress(0, 1, 4, 4);
            CellRangeAddress region5 = new CellRangeAddress(0, 0, 5, 8);
            CellRangeAddress region9 = new CellRangeAddress(0, 1, 9, 9);
            sheet.addMergedRegion(region);
            sheet.addMergedRegion(region1);
            sheet.addMergedRegion(region2);
            sheet.addMergedRegion(region3);
            sheet.addMergedRegion(region4);
            sheet.addMergedRegion(region5);
            // sheet.addMergedRegion(region6);
            // sheet.addMergedRegion(region7);
            // sheet.addMergedRegion(region8);
            sheet.addMergedRegion(region9);
        }
        
        return wb;
    }
    
    public static void downloadExcelToWebSite(HSSFWorkbook wb, HttpServletResponse response, String fileName) throws IOException {
        // response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setContentType("application/octet-stream;charset=ISO8859-1");
        response.setHeader("Content-disposition",
            "attachment; filename=" + new String(
                (URLEncoder.encode(fileName, CamsConstant.UTF_8) + "-" + DateUtilsEx.formatToString(new Date(), "yyyyMMddHHmmss") + ".xls").getBytes(),
                "ISO-8859-1"));
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            wb.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (wb != null) {
                // wb.dispose();
                wb.close();
            }
            if (os != null) {
                os.close();
            }
        }
    }
    
    public static void exportExcelToWebsite(HttpServletResponse response, String fileName, String[][] titles, String[] fields,
                                            List<?> dataList) throws Exception {
        
        // 初始化EXCEL
        HSSFWorkbook wb = initExcel(titles, fileName);
        exportExcel(response, fileName, titles, fields, dataList, wb);
    }
    
    public static void exportExcel(HttpServletResponse response, String fileName, String[][] titles, String[] fields, List<?> dataList,
                                   HSSFWorkbook wb) throws Exception {
        if (dataList != null) {
            int sheetCount = wb.getNumberOfSheets();
            HSSFCellStyle cellStyle = wb.createCellStyle();
            cellStyle.setWrapText(true);
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            for (int i = 0; i < sheetCount; i++) {
                HSSFSheet eachSheet = wb.getSheetAt(i);
                for (int row = 0; row < dataList.size(); row++) {
                    Object rowData = dataList.get(row);
                    HSSFRow eachDataRow = eachSheet.createRow(row + titles.length);
                    for (int col = 0; col < titles[0].length; col++) {
                        Object valueObj = null;
                        if (rowData instanceof Map<?, ?>) {
                            // map类型
                            valueObj = ((Map<?, ?>)rowData).get(fields[col]);
                        } else {
                            // 实体类
                            PropertyDescriptor pd = new PropertyDescriptor(fields[col], rowData.getClass());
                            valueObj = pd.getReadMethod().invoke(rowData);
                        }
                        // if (valueObj != null && valueObj.toString().startsWith("https://")) {
                        // ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
                        // URL url = new URL(valueObj.toString());
                        // RenderedImage bufferImg = ImageIO.read(url);
                        // ImageIO.write(bufferImg, "jpg", byteArrayOut);
                        //
                        // HSSFPatriarch patriarch = eachSheet.createDrawingPatriarch();
                        // // anchor主要用于设置图片的属性
                        // HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)col, row + 1, (short)(col +
                        // 1), (row + 2));
                        // anchor.setAnchorType(AnchorType.DONT_MOVE_AND_RESIZE);
                        // // 插入图片
                        // patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(),
                        // HSSFWorkbook.PICTURE_TYPE_JPEG));
                        // } else {
                            HSSFCell cell = eachDataRow.createCell(col);
                            cell.setCellStyle(cellStyle);
                            cell.setCellValue(valueObj == null ? "" : valueObj.toString());
                        // }
                    }
                }
                
            }
        }
        downloadExcelToWebSite(wb, response, fileName);
    }
    
    // @SuppressWarnings("unchecked")
    // public static void dynamicExportExcelToWebsite(HttpServletResponse response, String fileName, Map<String,
    // List<Object>> exportMap)
    // throws Exception {
    // List<Object> fieldsObjList = exportMap.get("fields");
    // List<Object> dataObjList = exportMap.get("data");
    // List<String> fields = new ArrayList<>();
    // List<String> titles = new ArrayList<>();
    // for (int i = 0; i < fieldsObjList.size(); i++) {
    // Object obj = fieldsObjList.get(i);
    // if (obj != null) {
    // Map<String, String> map = (Map<String, String>)obj;
    // fields.add(map.get("key"));
    // titles.add(map.get("name"));
    // }
    // }
    // String[] titlesArr = new String[titles.size()];
    // String[] fieldsArr = new String[fields.size()];
    // exportExcelToWebsite(response, fileName, titles.toArray(titlesArr), fields.toArray(fieldsArr), dataObjList);
    // }
    
    public static void exportOrderDocx(HttpServletResponse response, Map<String, Object> dataMap, String fileName,
                                       String templateName) throws Exception {
        HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
        Configure config = Configure.newBuilder().bind("picFiles", policy).build();
        
        ClassPathResource resource = new ClassPathResource("static/templates/" + templateName + ".docx");
        InputStream inputStream = resource.getInputStream();
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1"));
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("utf-8");
        XWPFTemplate template = XWPFTemplate.compile(inputStream, config).render(dataMap);
        
        OutputStream out = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        template.write(bos);
        template.close();
        bos.flush();
        bos.close();
        out.flush();
        out.close();
    }
    
}