package com.sy.coinage.util.printer;

import com.zebra.sdk.device.ZebraIllegalArgumentException;
import com.zebra.sdk.graphics.ZebraImageFactory;
import com.zebra.sdk.graphics.ZebraImageI;
import com.zebra.sdk.printer.PrinterUtil;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

/**
 * 产生图片处理类
 * @author liuhong
 */
@Slf4j
public class ImageProducerUtil {

    /**
     * 获取字体高度
     * @param font
     * @return
     */
    private static int getFontHeight(Font font) {
        return sun.font.FontDesignMetrics.getMetrics(font).getHeight();
    }


    /**
     * 先把整个标签做成图像缓存
     * @throws Exception
     */
    public static BufferedImage createImage()  {

        Font font1 = new Font("黑体", Font.BOLD, 36);//标题字体
        Font font2 = new Font("宋体", Font.BOLD, 28);//内容字体
        Font font3 = new Font("宋体", Font.BOLD, 24);//编号字体

        //300dpi ,尺寸100mm*24mm , 尺寸长宽应该是 12倍
        int w = 100 * 12;
        int h = 24 * 12 ;


        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 480, 48);// 画出一行字符串
        g.setFont(font2);
        g.drawString("品名: Y211", 60, 114);
        g.drawString("编号: IJ-0178",444,114);
        g.drawString("日期: 2021-07-30",804,114);

        g.drawString("皮重: 54.0kg", 60, 168);
        g.drawString("毛重: 1205kg", 444, 168);
        g.drawString("称重人: 小王", 804, 168);

        g.drawString("冠字号: 佰21伍-003-0621 至 佰21伍-003-0680",60,222);
        g.drawString("时间: 19:45:30",804,222);

//二维码(待定)

//        TwoDimensionCode handler = new TwoDimensionCode();
//        String encoderContentStr = "样品编号：TX2-18/03/29-003-123456-123\n委托编号：CEPR1-TX2-2018-130-1234567";
//        BufferedImage codeImg = handler.encoderQRCode(encoderContentStr, "png", 8);
//        g.drawImage(codeImg, 343, 40, codeImg.getWidth(), codeImg.getHeight(), null);
//
//        g.setFont(font2);
//        g.drawString("样品名称:一二三四五六七八九十一", 5, 240);

        g.dispose();

        return image;
    }



    public static BufferedImage createImage(RfidInfoDTO tpl)  {

        Font font1 = new Font("黑体", Font.BOLD, 36);//标题字体
        Font font2 = new Font("宋体", Font.BOLD, 28);//内容字体
        Font font3 = new Font("宋体", Font.BOLD, 24);//编号字体

        //300dpi ,尺寸100mm*24mm , 尺寸长宽应该是 12倍
        int w = 100 * 12;
        int h = 24 * 12 ;


        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 480, 48);// 画出一行字符串
        g.setFont(font2);
        g.drawString("品名: " + tpl.getSecurities(), 60, 114);
        g.drawString("编号: " + tpl.getSerialNumber(),444,114);
        g.drawString("日期: " + tpl.getWeightDate(),804,114);

        g.drawString("皮重: " + tpl.getTareWeight(), 60, 168);
        g.drawString("毛重: " + tpl.getGrossWeight(), 444, 168);
        g.drawString("称重人: " + tpl.getWeightor(), 804, 168);

        g.drawString("冠字号: " + tpl.getCrownBetween(),60,222);
        g.drawString("时间: " + tpl.getWeightTime(),804,222);

//二维码(待定)

//        TwoDimensionCode handler = new TwoDimensionCode();
//        String encoderContentStr = "样品编号：TX2-18/03/29-003-123456-123\n委托编号：CEPR1-TX2-2018-130-1234567";
//        BufferedImage codeImg = handler.encoderQRCode(encoderContentStr, "png", 8);
//        g.drawImage(codeImg, 343, 40, codeImg.getWidth(), codeImg.getHeight(), null);
//
//        g.setFont(font2);
//        g.drawString("样品名称:一二三四五六七八九十一", 5, 240);

        g.dispose();

        return image;
    }


    /**
     * 打印空白标签
     * @return
     */
    public static BufferedImage createImageBlank(String rfid)  {

        Font font1 = new Font("黑体", Font.BOLD, 36);//标题字体
        Font font2 = new Font("黑体", Font.BOLD, 28);//内容字体
        Font font3 = new Font("黑体", Font.BOLD, 24);//编号字体

        //300dpi ,尺寸100mm*24mm , 尺寸长宽应该是 12倍
        int w = 100 * 12;
        int h = 24 * 12 ;

        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 480, 48);// 画出一行字符串
        g.setFont(font2);
        g.drawString(rfid, 810,48);
        g.drawString("品名: " , 60, 114);
        g.drawString("编号: " ,444,114);
        g.drawString("日期: ",804,114);

        g.drawString("皮重: "  , 60, 168);
        g.drawString("毛重: " , 444, 168);
        g.drawString("称重人: ", 804, 168);

        g.drawString("冠字号: " ,60,222);
        g.drawString("时间: " ,804,222);


        g.dispose();

        return image;
    }


    /**
     * 先把整个标签做成图像缓存
     *  尺寸 86mm * 54mm
     * @throws Exception
     */
    public static BufferedImage createImage8654()  {

        Font font1 = new Font("宋体", Font.BOLD, 50);//标题字体
        Font font2 = new Font("宋体", Font.BOLD, 32);//字段字体
        Font font3 = new Font("宋体", Font.PLAIN, 32);//内容字体
        Font font4 = new Font("宋体",Font.PLAIN,24);//时间戳字体


        //300dpi ,尺寸86mm*54mm , 尺寸长宽应该是 12倍 （1mm约12个像素）
        int w = 86 * 12; //1032
        int h = 54 * 12 ; //648


        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 320, 80);// 画出一行字符串
        g.setFont(font2);
        g.drawString("品名: ", 100, 180);
        g.setFont(font3);
        g.drawString("Y211" ,220,180);
        g.setFont(font2);
        g.drawString("编号: ",600,180);
        g.setFont(font3);
        g.drawString("IJ-0178",720,180);

        g.setFont(font2);
        g.drawString("冠字号: ",100,280);
        g.setFont(font3);
        g.drawString("佰21伍-003-0621 至 佰21伍-003-0680",220,280);

        g.setFont(font2);
        g.drawString("皮重: ",100,380);
        g.setFont(font3);
        g.drawString("54.0kg",220,380);
        g.setFont(font2);
        g.drawString("日期: ",600,380);
        g.setFont(font3);
        g.drawString("2021-07-30",720,380);

        g.setFont(font2);
        g.drawString("毛重: ",100,480);
        g.setFont(font3);
        g.drawString("1205kg",220,480);
        g.setFont(font2);
        g.drawString("称重人: ",600,480);
        g.setFont(font3);
        g.drawString("小王",720,480);


        //绘制带边框的文字
        g.drawRect(400,580,300,30);
//        g.drawString("时间: 19:45:30",804,222);
        g.setFont(font4);
        g.drawString("2021-07-30 19:45:30",420,600);


        g.dispose();

        return image;
    }

    public static BufferedImage createImage8654(RfidInfoDTO tpl)  {

        Font font1 = new Font("宋体", Font.BOLD, 50);//标题字体
        Font font2 = new Font("宋体", Font.BOLD, 32);//字段字体
        Font font3 = new Font("宋体", Font.PLAIN, 32);//内容字体
        Font font4 = new Font("宋体",Font.PLAIN,24);//时间戳字体


        //300dpi ,尺寸86mm*54mm , 尺寸长宽应该是 12倍 （1mm约12个像素）
        int w = 86 * 12; //1032
        int h = 54 * 12 ; //648


        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 320, 80);// 画出一行字符串
        g.setFont(font2);
        g.drawString("品名: ", 100, 180);
        g.setFont(font3);
        g.drawString(tpl.getSecurities() ,220,180);
        g.setFont(font2);
        g.drawString("编号: ",600,180);
        g.setFont(font3);
        g.drawString("IJ-0178",720,180);

        g.setFont(font2);
        g.drawString("冠字号: ",100,280);
        g.setFont(font3);
        g.drawString("佰21伍-003-0621 至 佰21伍-003-0680",220,280);

        g.setFont(font2);
        g.drawString("皮重: ",100,380);
        g.setFont(font3);
        g.drawString("54.0kg",220,380);
        g.setFont(font2);
        g.drawString("日期: ",600,380);
        g.setFont(font3);
        g.drawString("2021-07-30",720,380);

        g.setFont(font2);
        g.drawString("毛重: ",100,480);
        g.setFont(font3);
        g.drawString("1205kg",220,480);
        g.setFont(font2);
        g.drawString("称重人: ",600,480);
        g.setFont(font3);
        g.drawString("小王",720,480);


        //绘制带边框的文字
        g.drawRect(400,580,300,30);
//        g.drawString("时间: 19:45:30",804,222);
        g.setFont(font4);
        g.drawString("2021-07-30 19:45:30",420,600);


        g.dispose();

        return image;
    }


    /**
     * 先把整个标签做成图像缓存， 标签尺寸95*22
     * @throws Exception
     */
    public static BufferedImage createImage95_22()  {

        Font font1 = new Font("黑体", Font.BOLD, 36);//标题字体
        Font font2 = new Font("黑体", Font.PLAIN, 28);//内容字体
        Font font3 = new Font("黑体", Font.PLAIN, 24);//编号字体

        //300dpi ,尺寸95mm*22mm , 尺寸长宽应该是 12倍
        int w = 95 * 12;
        int h = 22 * 12 ;


        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 460, 48);// 画出一行字符串
        g.setFont(font2);
        g.drawString("品名: Y211", 70, 114);
        g.drawString("编号: IJ-0178",444,114);
        g.drawString("日期: 2021-07-30",804,114);

        g.drawString("皮重: 54.0kg", 70, 168);
        g.drawString("毛重: 1205kg", 444, 168);
        g.drawString("称重人: 小王", 804, 168);

        g.drawString("冠字号: 佰21伍-003-0621 至 佰21伍-003-0680",70,222);
        g.drawString("时间: 19:45:30",804,222);


        g.dispose();

        return image;
    }

    /**
     * 实际标签的尺寸 95*22
     * @param tpl
     * @return
     */
    public static BufferedImage createImage95_22(RfidInfoDTO tpl)  {

        Font font1 = new Font("黑体", Font.BOLD, 36);//标题字体
        Font font2 = new Font("黑体", Font.PLAIN, 28);//内容字体
        Font font3 = new Font("黑体", Font.PLAIN, 24);//编号字体

        //300dpi ,尺寸100mm*24mm , 尺寸长宽应该是 12倍
        int w = 95 * 12;
        int h = 22 * 12 ;


        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 460, 48);// 画出一行字符串
        g.setFont(font2);
        g.drawString("品名: " + tpl.getSecurities(), 70, 114);
        g.drawString("编号: " + tpl.getSerialNumber(),444,114);
        g.drawString("日期: " + tpl.getWeightDate(),804,114);

        g.drawString("皮重: " + tpl.getTareWeight(), 70, 168);
        g.drawString("毛重: " + tpl.getGrossWeight(), 444, 168);
        g.drawString("称重人: " + tpl.getWeightor(), 804, 168);

        g.drawString("冠字号: " + tpl.getCrownBetween(),70,222);
        g.drawString("时间: " + tpl.getWeightTime(),804,222);

        g.dispose();

        return image;
    }


    /**
     * 打印空白标签 95*22尺寸
     * @return
     */
    public static BufferedImage createImageBlank95_22(String rfid)  {

        Font font1 = new Font("黑体", Font.BOLD, 36);//标题字体
        Font font2 = new Font("黑体", Font.BOLD, 28);//内容字体
        Font font3 = new Font("黑体", Font.BOLD, 24);//编号字体

        //300dpi ,尺寸100mm*24mm , 尺寸长宽应该是 12倍
        int w = 95 * 12;
        int h = 22 * 12 ;

        // 创建图片
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);// 创建图片画布
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE); // 先用白色填充整张图片,也就是背景
        g.fillRect(0, 0, w, h);// 画出矩形区域，以便于在矩形区域内写入文字
        g.setColor(Color.black);// 再换成黑色，以便于写入文字
        g.setFont(font1);// 设置画笔字体
        g.drawString("沈阳造币有限公司", 460, 48);// 画出一行字符串
        g.setFont(font2);
        g.drawString(rfid, 810,48);
        g.drawString("品名: " , 70, 114);
        g.drawString("编号: " ,444,114);
        g.drawString("日期: ",804,114);

        g.drawString("皮重: "  , 70, 168);
        g.drawString("毛重: " , 444, 168);
        g.drawString("称重人: ", 804, 168);

        g.drawString("冠字号: " ,70,222);
        g.drawString("时间: " ,804,222);


        g.dispose();

        return image;
    }

    /**
     * 将bufferdImage转换为zpl
     * 通过ZebraImageI 自带的图片转换工具
     * @param image
     * @return
     */

    public static String image2Zpl(BufferedImage image){

        try {
            ZebraImageI img = ZebraImageFactory.getImage(image); //zebra自带
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            PrinterUtil.convertGraphic("R:SAMPLE.GRF",img,outputStream);

            String zplString = outputStream.toString("utf-8");
            return zplString;
        } catch (IOException e) {
            log.error(" image2Zpl error :ioException:{}",e.getMessage());
        } catch (ZebraIllegalArgumentException e) {
            log.error(" image2Zpl error :ZebraIllegalArgumentException:{}",e.getMessage());
        }
        return null;
    }


    public static void main(String args[]) throws Exception{

        RfidInfoDTO dtl = new RfidInfoDTO();
        dtl.setSecurities("Y211");
        dtl.setSerialNumber("IJ-0178");
        dtl.setTareWeight("54.0kg");
        dtl.setGrossWeight("1205kg");
        dtl.setWeightor("小王");
        dtl.setCrownBetween("佰21伍-003-0621(至)佰21伍-003-0680");
        dtl.setWeightTime("19:45:30");
        dtl.setWeightDate("2023-11-02");

        // zebra自带的转换方式，没有测试通过
//        ZebraImageI img = ZebraImageFactory.getImage(createImage(dtl)); //zebra自带
//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//        PrinterUtil.convertGraphic("R:SAMPLE.GRF",img,outputStream);
//        String zplString = outputStream.toString("UTF-8");

       // System.out.println(zplString);

//        String begin = "^XA"; // 标签格式以^XA开始
//        String end = "^XZ"; // 标签格式以^XZ结束
//        String zplStr = begin + zplString + end;

//        BufferedImage bfImg = createImage( dtl);
//       String  strZpl = ImgToZpl.convertFromImg(bfImg);
//
//        System.out.println(strZpl);
        BufferedImage bfImg = createImage95_22();
        File desFile = new File("/Users/liuhong/IdeaProjects/kangrui/tenant_coinage/95_22.png");
        ImageIO.write(bfImg,"png",desFile);


    }


}
