package shkd.repc.recon.formplugin;

import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.fileservice.FileItem;
import kd.bos.fileservice.FileService;
import kd.bos.fileservice.FileServiceFactory;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.events.AfterDoOperationEventArgs;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.sdk.plugin.Plugin;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.*;

import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.EventObject;
import java.util.List;

/**
 * 二开导入模板
 */
public class ContractMaterialTemplatePlugin extends AbstractFormPlugin implements Plugin {


    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        //工具栏控件
        this.addItemClickListeners("qeug_advcontoolbarap21");
    }

    @Override
    public void afterDoOperation(AfterDoOperationEventArgs evt) {
        String operateKey = evt.getOperateKey();
        if (StringUtils.equals("exporttemplate",operateKey)){
            //根据导入模板配置导出数据
            QFilter number = new QFilter("number", QCP.equals, "recon_contractbill_IMPT_ENTRY");
            DynamicObject template = BusinessDataServiceHelper.loadSingle("bos_importentry_template", number.toArray());
            if (null == template) {
                this.getView().showMessage("请先维护引入模板");
                return;
            }
            //表头字段
            List<DynamicObject> list = new ArrayList<>();
            DynamicObjectCollection entry = template.getDynamicObjectCollection("treeentryentity");
            if (null != entry && entry.size() != 0) {
                for (int i = 0; i < entry.size(); i++) {
                    DynamicObject dynamicObject = entry.get(i);
                    if (dynamicObject.getBoolean("isimport")) {
                        list.add(dynamicObject);
                    }
                }
            }
            if (list.size() == 0) return;
            //构建导出前四行数据

            // 创建Excel工作簿
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("明细 # qeug_orderformentry");

            // 第一行:明细标题
            XSSFRow row1 = sheet.createRow(0);
            XSSFCell cell1 = row1.createCell(0);
            cell1.setCellValue("明细 # qeug_orderformentry");
            XSSFCellStyle style1 = workbook.createCellStyle();
            XSSFFont font1 = workbook.createFont();
            font1.setFontName("宋体");
            font1.setFontHeightInPoints((short) 11);
            style1.setFont(font1);
            style1.setAlignment(HorizontalAlignment.CENTER);
            style1.setVerticalAlignment(VerticalAlignment.CENTER);
            sheet.setColumnWidth(0, 31 * 256); // 设置列宽
            row1.setHeightInPoints(14.4f);
            cell1.setCellStyle(style1);

            // 第二行:说明文本
            XSSFRow row2 = sheet.createRow(1);
            XSSFCell cell2 = row2.createCell(0);
            cell2.setCellValue("1、请将鼠标移到灰色标题行查看字段录入要求。2、红色带星号(*)的字段为必录字段。");
            XSSFCellStyle style2 = workbook.createCellStyle();
            XSSFFont font2 = workbook.createFont();
            font2.setFontName("Calibri");
            font2.setFontHeightInPoints((short) 11);
            style2.setFont(font2);
            style2.setAlignment(HorizontalAlignment.LEFT);
            style2.setVerticalAlignment(VerticalAlignment.CENTER);
            style2.setWrapText(true); // 自动换行
            row2.setHeightInPoints(60);
            sheet.setColumnWidth(0, 31 * 256); // 设置列宽
            cell2.setCellStyle(style2);

            // 第三行:list中的entitynumber
            XSSFRow row3 = sheet.createRow(2);
            for (int i = 0; i < list.size(); i++) {
                DynamicObject dynamicObject = list.get(i);
                String entityNumber = null;
                String importProp = dynamicObject.getString("importprop");
                if (!("").equals(importProp)) {
                    entityNumber = dynamicObject.getString("entitynumber") + "." + dynamicObject.getString("importprop");
                } else {
                    entityNumber = dynamicObject.getString("entitynumber");
                }

                XSSFCell cell = row3.createCell(i);
                cell.setCellValue(entityNumber);
                XSSFCellStyle style3 = workbook.createCellStyle();
                XSSFFont font3 = workbook.createFont();
                font3.setFontName("宋体");
                font3.setFontHeightInPoints((short) 11);
                style3.setFont(font3);
                style3.setAlignment(HorizontalAlignment.CENTER);
                style3.setVerticalAlignment(VerticalAlignment.CENTER);
                sheet.setColumnWidth(i, 31 * 256); // 设置列宽
                row3.setHeightInPoints(14.4f);
                cell.setCellStyle(style3);
            }

            // 第四行:list中的entityname
            XSSFRow row4 = sheet.createRow(3);
            for (int i = 0; i < list.size(); i++) {
                DynamicObject dynamicObject = list.get(i);
                String entityName = dynamicObject.getString("entitydescription");
                XSSFCell cell = row4.createCell(i);
                cell.setCellValue(entityName);
                XSSFCellStyle style4 = workbook.createCellStyle();
                XSSFFont font4 = workbook.createFont();
                font4.setFontName("Calibri");
                font4.setFontHeightInPoints((short) 11);
                font4.setColor(IndexedColors.RED.getIndex());
                style4.setFont(font4);
                style4.setAlignment(HorizontalAlignment.CENTER);
                style4.setVerticalAlignment(VerticalAlignment.CENTER);
                style4.setFillForegroundColor(new XSSFColor(new Color(192, 192, 192), new DefaultIndexedColorMap())); // 灰色背景
                style4.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                sheet.setColumnWidth(i, 31 * 256); // 设置列宽
                row4.setHeightInPoints(14.4f);
                cell.setCellStyle(style4);
            }
            // 上传Excel文件并获取下载路径
            String uploadedFilePath = uploadExcel(workbook);
            String downloadUrl = RequestContext.get().getClientFullContextPath() + "/attachment/download.do?path=" + uploadedFilePath;
            this.getView().openUrl(downloadUrl);
        }
    }


    /**
     * 上传Excel文件并返回路径
     */
    private String uploadExcel(XSSFWorkbook workbook) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
        String fileName = "导入模板_" + sdf.format(new Date()) + ".xlsx";
        String pathName = "/offices/" + fileName;
        try {
            OutputStream outputStream = new ByteArrayOutputStream();
            workbook.write(outputStream);
            InputStream inputStream = parse(outputStream);

            FileService fs = FileServiceFactory.getAttachmentFileService();
            return fs.upload(new FileItem(fileName, pathName, inputStream));
        } catch (Exception e) {
            //logger.error("上传Excel失败", e);
            throw new RuntimeException("上传Excel失败", e);
        }
    }

    /**
     * 解析输出流为输入流
     */
    public ByteArrayInputStream parse(final OutputStream out) throws Exception {
        ByteArrayOutputStream outputStream = (ByteArrayOutputStream) out;
        return new ByteArrayInputStream(outputStream.toByteArray());
    }
}