package com.jwipc.finance.util;

import com.alibaba.fastjson2.JSONObject;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.jwipc.finance.dto.AccountStatementDTO;
import com.jwipc.finance.model.po.StatementItemPO;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Map;

/**
 * @author qizhicai
 * @version JDK 1.8
 * @date 2025/1/12
 * @description TODO
 */
public class CreatePdfUtil {

    public static byte[] createPdfFile(Map<String, Object> map ,String imgFilePath) throws DocumentException, IOException {

    //合同文件内容格式
        //页眉 login 编号
        // String imgUrl = sysProp.getHostUrl() + "/static/img/invoice/gxhtlogo.png";
        // String textContent = "JWIPC Technology Co.,Ltd."; // 要添加的文本内容
        //购销合同 居中
        //合同编号：${(jeHj.contractCode)!} 居右 换行
        //订货单位(甲方)：${(data.companyName)!}<br>居左
        //供货单位(乙方)：${(data.supplierName)!}<br>居左
        //文本段落：根据《中华人民共和国民法典》的有关规定，依平等互利，诚实信用的原则，双方同意成交下列产品，产品名称、规格型号、数量、单价、总金额等信息如下：换行
        //一：订货明细  居左 订货日期：${(jeHj.dhrq)!}居右
        //明细列表
        //|序号|类别(中文)|品名|单位|数量|单价|金额|
        //|尾差金额      |                    |
        //|合计|金额(大写)：${(jeHj.jedx)!|金额小写：${(jeHj.sqje?string('#.##'))!}|
        //固定文本：
        //二、交货地址：送货上门
    //三、结款方式：${(data.paymentWay)!}
    //四、验收方式：本公司所有材料按相对应的GBT2828.1-2012抽样计划[AQL]进行验收。
    //五、违约责任 换行
    //1、供方提供的产品质量未能达到智微智能所定之质量目标，造成智微智能生产线停线或重工等，供方应负责赔偿需方所受之一切损失，依据采购框架协议11条品质及罚则处理。<br>
    //2、供方对于需方所采购的产品欲停产或改变该产品制程或零组件、原材料时，应事先通知需方相关人员（零件停产应于半年前为通知）并取得需方书面同意后方可执行。若供方未按照本条规定在改变产品之制程或零组件、原材料时提前通知需方并取得需方书面同意，需方可将该批产品全数退还予供方，供方并应负责赔偿需方因此所造成的一切损失及费用。<br>
        // 3、供方在接到订单的当天必须对订单进行确认,确认后的订单不得以任何理由推迟交期，每推迟一天交货应当向需方支付不能交付部分货款总值30％的违约金，除上述违约金外，应依需方的裁量及决定，由供方赔偿给需方造成的全部损失及所有附加费用。逾期五天的视为不能供货，需方有权延迟付款，或解除协议并要求供方赔偿全部损失。<br>
   //六、本协议一式两份，盖章后生效，双方各执一份
                // 甲方：${(data.companyName)!} 乙方：${(data.supplierName)!}
                // 代表签字：                     代表签字：
                //  日期：${(jeHj.dhrq)!}       日期：${(jeHj.dhrq)!}
                //每页页码

        String fonts =  "/static/font/msyh.ttc,1";
        Document document = new Document(PageSize.A4);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter writer = PdfWriter.getInstance(document, baos);
        final BaseFont font3 = BaseFont.createFont(fonts, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);


        Font fontTitle = new Font(font3, 18, Font.NORMAL,  BaseColor.BLACK);  // 使用普通字体并设置为浅灰色

        Font font_1 = new Font(font3, 10, Font.NORMAL, BaseColor.BLACK);//加粗字体
        writer.setPageEvent(new PdfUtilPageEvent(imgFilePath)); //添加login
       // 打开文档
        document.open();
        Font fontContent = new Font(font3, 10, Font.NORMAL, BaseColor.BLACK);
        //设置抬头
        Paragraph title = new Paragraph("购销合同", fontTitle);
        title.setAlignment(1);
        document.add(title);
        // 居中 空一行
        Paragraph emptyRow = new Paragraph(10f, " ", fontContent);
        document.add(emptyRow);
        //设置第一行数据合同编号 合同编号：${(jeHj.contractCode)!}

        //json 数据
        //列表数据
        JSONObject jeHj = (JSONObject) map.get("jeHj");
        List<StatementItemPO> poList = (List<StatementItemPO>) map.get("detailList");
        AccountStatementDTO data = (AccountStatementDTO) map.get("data");
        // 创建一个表格，参数为列数
        int columns = 1;
        PdfPTable table = new PdfPTable(columns);
        // 设置表格没有边框
        table.getDefaultCell().setBorder(0);
        // 第一行
        PdfPCell cell1 = new PdfPCell(new Phrase("合同编号："+jeHj.getString("contractCode"), font_1));
        cell1.setBorder(0);  // 不显示边框
        cell1.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT);  // 设置左对齐
        table.addCell(cell1);
        PdfPCell emptyCell1 = new PdfPCell(new Phrase(" "));
        emptyCell1.setBorder(0);  // 不显示边框
        emptyCell1.setFixedHeight(15f);  // 设置高度以增加间距
        table.addCell(emptyCell1);
        document.add(table);
        //订货单位(甲方)：${(data.companyName)!}<br>居左
        //供货单位(乙方)：${(data.supplierName)!}<br>居左
        //文本段落：根据《中华人民共和国民法典》的有关规定，依平等互利，诚实信用的原则，双方同意成交下列产品，产品名称、规格型号、数量、单价、总金额等信息如下：换行
        //一：订货明细  居左 订货日期：${(jeHj.dhrq)!}居右
        Paragraph ph03 = new Paragraph();
        Chunk c08 = new Chunk("订货单位(甲方)： ", font_1);
        Chunk c09 = new Chunk(data.getCompanyName(), font_1);
        ph03.add(c08);
        ph03.add(c09);
        document.add(ph03);
        //需方：
        Paragraph ph04 = new Paragraph();
        Chunk c101 = new Chunk("供货单位(乙方)： ", font_1);
        Chunk c102 = new Chunk(data.getSupplierName(), font_1);
        ph04.add(c101);
        ph04.add(c102);
        document.add(ph04);
        //文本段落： 设置第二行数据
        Chunk c108 = new Chunk("    根据《中华人民共和国民法典》的有关规定，依平等互利，诚实信用的原则，双方同意成交下列产品，产品名称、规格型号、数量、单价、总金额等信息如下：  ",font_1);
        document.add(c108);
        document.add(Chunk.NEWLINE);

        //一：订货明细  居左 订货日期：${(jeHj.dhrq)!}居右
        Paragraph ph02 = new Paragraph();
        Chunk c03= new Chunk("一、订货明细 ", font_1);
        Chunk c05 = new Chunk("                                                                             ", font_1);
        ph02.add(c03);
        ph02.add(c05);
        Chunk c06 = new Chunk("订货日期: ", font_1);
        Chunk c07 = new Chunk(jeHj.getString("dhrq"), font_1);
        ph02.add(c06);
        ph02.add(c07);
        document.add(ph02);
        //明细表格
// 空一行
        Paragraph empty = new Paragraph(10f, " ", fontContent);
        document.add(empty);

        createBlankTable(writer, document, font3, 10);
        createTable(writer,font3,document,poList,jeHj.getBigDecimal("wxje"),jeHj.getString("jedx"),jeHj.getBigDecimal("sqje"));
        createBlankTable(writer, document, font3, 10);

        //条款

        Font font1 = null;
        try {
            BaseFont baseFont = BaseFont.createFont(fonts, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            font1 = new Font(baseFont, 10); // 12是字体大小，可以根据实际需要调整
            // 然后将字体应用到你的 PDF 文档或者其他需要的地方
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
        // 二、交货地址：送货上门
        Paragraph preface1 = new Paragraph();
        preface1.add(new Chunk("二、交货地址：送货上门",font_1));
        document.add(preface1);
        //三、结款方式：
        Paragraph preface2 = new Paragraph();
        preface2.add(new Chunk("三、结款方式："+data.getPaymentWay(),font_1));
        document.add(preface2);
        //四、验收方式：
        Paragraph preface3 = new Paragraph();
        preface3.add(new Chunk("四、验收方式：本公司所有材料按相对应的GBT2828.1-2012抽样计划[AQL]进行验收。",font_1));
        document.add(preface3);
        //五、违约责任 换行
        Paragraph preface4 = new Paragraph();
        preface4.add(new Chunk("五、违约责任",font_1));
        document.add(preface4);
        Paragraph preface4_1 = new Paragraph();
        preface4_1.add(new Chunk("1、供方提供的产品质量未能达到智微智能所定之质量目标，造成智微智能生产线停线或重工等，供方应负责赔偿需方所受之一切损失，依据采购框架协议11条品质及罚则处理。",font_1));
        document.add(preface4_1);
        Paragraph preface4_2 = new Paragraph();
        preface4_2.add(new Chunk("2、供方对于需方所采购的产品欲停产或改变该产品制程或零组件、原材料时，应事先通知需方相关人员（零件停产应于半年前为通知）并取得需方书面同意后方可执行。若供方未按照本条规定在改变产品之制程或零组件、原材料时提前通知需方并取得需方书面同意，需方可将该批产品全数退还予供方，供方并应负责赔偿需方因此所造成的一切损失及费用。",font_1));
        document.add(preface4_2);
        Paragraph preface4_3 = new Paragraph();
        preface4_3.add(new Chunk("3、供方在接到订单的当天必须对订单进行确认,确认后的订单不得以任何理由推迟交期，每推迟一天交货应当向需方支付不能交付部分货款总值30％的违约金，除上述违约金外，应依需方的裁量及决定，由供方赔偿给需方造成的全部损失及所有附加费用。逾期五天的视为不能供货，需方有权延迟付款，或解除协议并要求供方赔偿全部损失。",font_1));
        document.add(preface4_3);
        Paragraph preface5 = new Paragraph();
        preface5.add(new Chunk("六、本协议一式两份，盖章后生效，双方各执一份",font_1));
        document.add(preface5);

        Paragraph emptyRow1 = new Paragraph(20f, " ", fontContent);
        document.add(emptyRow1);
        //甲乙双方盖章信息
        int columns1 = 2;
        PdfPTable table1 = new PdfPTable(columns1);
        float tableWidth = 530.28f;  // A4纸宽度595.28px，减去左右30px
        table1.setTotalWidth(tableWidth);
        table1.setLockedWidth(true);  // 锁定表格宽度
        // 设置表格没有边框
        table1.getDefaultCell().setBorder(0);

        // 第一行
        PdfPCell cell11 = new PdfPCell(new Phrase("甲方："+data.getCompanyName(), font_1));
        cell11.setBorder(0);  // 不显示边框
        cell11.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置左对齐
        table1.addCell(cell11);

        PdfPCell cell2 = new PdfPCell(new Phrase("乙方："+data.getSupplierName(), font_1));
        cell2.setBorder(0);  // 不显示边框
        cell2.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置左对齐
        table1.addCell(cell2);

        // 插入一个空行，增加间距
        PdfPCell emptyCell11 = new PdfPCell(new Phrase(" "));
        emptyCell11.setBorder(0);  // 不显示边框
        emptyCell11.setFixedHeight(15f);  // 设置高度以增加间距
        table1.addCell(emptyCell11);

        PdfPCell emptyCell2 = new PdfPCell(new Phrase(" "));
        emptyCell2.setBorder(0);  // 不显示边框
        emptyCell2.setFixedHeight(15f);  // 设置高度以增加间距
        table1.addCell(emptyCell2);

        // 第二行
        PdfPCell cell3 = new PdfPCell(new Phrase("代表签字：", font_1));
        cell3.setBorder(0);  // 不显示边框
        cell3.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置左对齐
        table1.addCell(cell3);

        PdfPCell cell4 = new PdfPCell(new Phrase("代表签字：", font_1));
        cell4.setBorder(0);  // 不显示边框
        cell4.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置左对齐
        table1.addCell(cell4);

        // 插入一个空行，增加间距
        PdfPCell emptyCell3 = new PdfPCell(new Phrase(" "));
        emptyCell3.setBorder(0);  // 不显示边框
        emptyCell3.setFixedHeight(15f);  // 设置高度以增加间距
        table1.addCell(emptyCell3);

        PdfPCell emptyCell4 = new PdfPCell(new Phrase(" "));
        emptyCell4.setBorder(0);  // 不显示边框
        emptyCell4.setFixedHeight(15f);  // 设置高度以增加间距
        table1.addCell(emptyCell4);

        // 第三行
        PdfPCell cell5 = new PdfPCell(new Phrase("日期："+jeHj.getString("dhrq"), font_1));
        cell5.setBorder(0);  // 不显示边框
        cell5.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置左对齐
        table1.addCell(cell5);
        PdfPCell cell6 = new PdfPCell(new Phrase("日期："+jeHj.getString("dhrq"), font_1));
        cell6.setBorder(0);  // 不显示边框
        cell6.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置左对齐
        table1.addCell(cell6);
        // 将表格添加到文档中
        document.add(table1);
        // 关闭文档
        document.close();
        byte[] pdfBytes = baos.toByteArray();
        return pdfBytes;
    }

    /**
     * 创建表格跟表格之间的空白间隔
     */
    public static void createBlankTable(PdfWriter writer, Document document, BaseFont font, int height) throws DocumentException {
        PdfPTable table = new PdfPTable(new float[]{30});
        table.setTotalWidth(520);
        table.setPaddingTop(10);
        table.setLockedWidth(true);
        table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中
      //  table.writeSelectedRows(0, -1, 500, 800, writer.getDirectContentUnder());
        Font textFont = new Font(font, 10, Font.NORMAL);
        PdfPCell cell = new PdfPCell(new Paragraph(" ", textFont));
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        cell.setVerticalAlignment(Element.ALIGN_BOTTOM);
        cell.setBorder(0);
        cell.setFixedHeight(height);
        cell.setColspan(1);
        table.addCell(cell);
        document.add(table);
    }




    //添加表格
    public static void createTable(PdfWriter writer, BaseFont font3, Document document, List<StatementItemPO> list, BigDecimal  wcje, String jedx, BigDecimal jexx) throws DocumentException, IOException {
        PdfPTable table = new PdfPTable(new float[]{40, 40, 170, 30, 30,50,50});
        table.setTotalWidth(520);
      //  table.setPaddingTop(10);
        table.setLockedWidth(true);
        table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中
        table.setSpacingBefore(10); // 设置表格顶部间距，避免与页眉重叠
        //定义数据的字体
        Font textFont = new Font(font3, 10, Font.NORMAL);
        //表字段
        String title[] = {"序号", "类别(中文)", "品名", "单位", "数量","单价","金额"};
        for (int i = 0; i < title.length; i++) {
            PdfPCell heardCell = new PdfPCell();
            heardCell.setRowspan(1);
            heardCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            heardCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            heardCell.setPhrase(new Phrase(title[i], textFont));
            heardCell.setMinimumHeight(20);
            table.addCell(heardCell);
        }
        DecimalFormat decimalFormat = new DecimalFormat("#.##");
        for (int i = 0; i < list.size(); i++) {
            PdfPCell setCell1 = createSetCell(String.valueOf((i + 1)), textFont);
            PdfPCell setCell2 = createSetCell(list.get(i).getMiddleClass(), textFont);
            PdfPCell setCell3 = createSetCell(list.get(i).getMaterialName(), textFont);
            PdfPCell setCell4 = createSetCell(list.get(i).getMaterialUnit(), textFont);
            PdfPCell setCell5 = createSetCell(String.valueOf(list.get(i).getAsQuantity()), textFont);
            PdfPCell setCell6 = createSetCell(list.get(i).getTaxPriceStr(),textFont);
            PdfPCell setCell7 = createSetCell(decimalFormat.format(list.get(i).getTaxAmount()), textFont);
            table.addCell(setCell1);
            table.addCell(setCell2);
            table.addCell(setCell3);
            table.addCell(setCell4);
            table.addCell(setCell5);
            table.addCell(setCell6);
            table.addCell(setCell7);
        }

        table.addCell(new Phrase("尾差金额", textFont));
        // 尾差金额列
        PdfPCell cellwx = new PdfPCell(new Phrase("" + wcje, textFont));
        cellwx.setColspan(6);  // 合并 3 列
        cellwx.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  // 设置居中
        table.addCell(cellwx);

        table.addCell(new Phrase("合计", textFont));
        // 合计金额大写占3列
        PdfPCell cell2 = new PdfPCell(new Phrase("金额(大写)： " + jedx, textFont));
        cell2.setColspan(4);  // 设置金额大写占 3 行
        cell2.setHorizontalAlignment(PdfPCell.ALIGN_LEFT);  // 设置左对齐
        table.addCell(cell2);

        // 金额小写占1列
        PdfPCell cell3 = new PdfPCell(new Phrase("金额小写：" + decimalFormat.format(jexx), textFont));
        cell3.setColspan(2);  // 设置金额小写占 2 列
        cell3.setHorizontalAlignment(PdfPCell.ALIGN_LEFT);  // 设置左对齐
        table.addCell(cell3);
        table.completeRow();
        document.add(table);
    }

    //为一个表格添加内容
    public static PdfPCell createSetCell(String value,Font font){
        PdfPCell cell = new PdfPCell();
        cell.setPhrase(new Phrase(value,font));
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        return cell;
    }
}
