package com.ho.flow.util;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class PDFutil {

    /**
     * 设置标题
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param cols 合并几列
     * @param rows 合并几行
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getTitle(PdfPTable table, Font textFont, String value, Integer cols, Integer rows, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setColspan(cols);
        cell.setRowspan(rows);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.setBorderColor(BaseColor.WHITE);// 设置方向后会失效
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 设置单元格
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getPdfCell(PdfPTable table, Font textFont, String value, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1); // -1:未定义，0:左，1:中，2:右，3:合适的，4:上，5:中，6:下，7:底线
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 合并行（合并行(上下合并)时，设置为垂直居中）
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param rows 合并几行
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getRowSpan(PdfPTable table, Font textFont, String value, Integer rows, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setRowspan(rows);
        if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 合并列（合并列(左右合并)时，设置为水平居中）
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param cols 合并几列
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getColSpan(PdfPTable table, Font textFont, String value, Integer cols, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setColspan(cols);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 合并行和列
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param cols 合并几列
     * @param rows 合并几行
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getRowAndColSpan(PdfPTable table, Font textFont, String value,
                                      Integer cols, Integer rows, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setColspan(cols);
        cell.setRowspan(rows);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 水平居中
     * @param cell PdfPCell单元格
     * @return PdfPCell单元格
     */
    public PdfPCell getHorizontalCenter(PdfPCell cell){
        cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);// 水平居中
        return cell;
    }

    /**
     * 垂直居中
     * @param cell PdfPCell单元格
     * @return PdfPCell单元格
     */
    public PdfPCell getVerticalCenter(PdfPCell cell){
        cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
        cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
        cell.setPaddingTop(-2f);//把字垂直居中
        cell.setPaddingBottom(8f);//把字垂直居中
        return cell;
    }

    /**
     * 填充数据
     * @param table 表
     * @param str 填充的数据
     * @param font 字体设置
     */
    public void cellFillChar(PdfPTable table,String str,Font font){
        //如果str为空，不会报错，这个单元格为空
        PdfPCell cell = new PdfPCell(new Paragraph(str,font));
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
        table.addCell(cell);
    }

    /**
     * 图片填充方法
     * @param table 表
     * @param path 图片存在路径
     */
    public void cellFillImage(PdfPTable table,String path){
        // 创建图片对象
        Image image = null;
        try {
            image = Image.getInstance(path);
            image.setScaleToFitHeight(true);
            image.setScaleToFitLineWhenOverflow(true);
            if (image != null){
                // 创建包含图片的单元格
                PdfPCell cellWithImage = new PdfPCell(image,true);
                cellWithImage.setFixedHeight(50f);
                cellWithImage.setHorizontalAlignment(Element.ALIGN_CENTER);
                cellWithImage.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
                table.addCell(cellWithImage);

            }
        } catch (BadElementException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 图片填充方法
     * @param table 表
     * @param path 图片存在路径
     * @param fileName 文件名
     * @param font 字体
     */
    public void cellFillFile(PdfPTable table,String path,String fileName,Font font){
        // 创建图片对象
        Chunk imdb = new Chunk(fileName);
            if (imdb != null){
                PdfPCell fileCell = new PdfPCell();
                // 创建包含图片的单元格
                imdb.setFont(font);
                imdb.setAnchor(path);
                fileCell.setHorizontalAlignment(Element.ALIGN_CENTER);
                fileCell.addElement(imdb);
                table.addCell(fileCell);
            }
    }

}