package com.zbf.system.print;


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.zbf.system.domain.TRkWareNoticeTabUpdate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 源辰信息
 * 销售清单对象
 * @author navy
 * 2017年5月23日
 */
@Slf4j
public class SalesTicket implements Printable{
	private TRkWareNoticeTabUpdate update; //物料

	private String printName; //打印选项 是选择打印机1还是打印机2

	public String getPrintName() {
		return printName;
	}


	private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE");

	public SalesTicket(TRkWareNoticeTabUpdate update, String printName) {
		super();
		this.update = update;
		this.printName = printName;
	}

 
	/**
	 * 打印方法
	 * graphics - 用来绘制页面的上下文，即打印的图形
	 * pageFormat - 将绘制页面的大小和方向，即设置打印格式，如页面大小一点为计量单位（以1/72 英寸为单位，1英寸为25.4毫米。A4纸大致为595 × 842点）
	 * 				小票纸宽度一般为58mm，大概为165点
	 * pageIndex - 要绘制的页面从 0 开始的索引 ，即页号
	 */
	@Override
	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
		//此 Graphics2D 类扩展 Graphics 类，以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
		//它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。 
		Graphics2D g2 = (Graphics2D) graphics;  
 
		g2.setColor(Color.black);//设置打印颜色为黑色  
 
		//打印起点坐标  
		double x= pageFormat.getImageableX();  //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 x坐标。  
		double y= pageFormat.getImageableY();  //返回与此 PageFormat相关的 Paper对象的可成像区域左上方点的 y坐标。
 
		//Font.PLAIN： 普通样式常量  	Font.ITALIC 斜体样式常量	Font.BOLD 粗体样式常量。
		Font font = new Font("宋体",Font.BOLD,10); //根据指定名称、样式和磅值大小，创建一个新 Font。
		
		g2.setFont(font);//设置标题打印字体
		
		float heigth = font.getSize2D();//获取字体的高度
		
		//设置小票的标题标题  
//		g2.drawString("源辰信息科技有限公司",(float)x+60,(float)y+heigth);
		
		float line = 4*heigth; //下一行开始打印的高度
//		float line = heigth; //下一行开始打印的高度
		g2.setFont(new Font("宋体", Font.BOLD,8));//设置正文字体
		heigth = font.getSize2D();// 字体高度

//		line+=2;
		//设置操作员 
//		g2.drawString("操作员:"+operatorName,(float)x+20,(float)y+line);
//		line+=heigth;
		
		//设置订单号  
//		g2.drawString("订单号:"+orderId, (float)x+20,(float)y+line);
//		line+=heigth+2;
		//***********************************打印图片*********************************************//
		Component c = null;
		Image src =Toolkit.getDefaultToolkit().getImage("print_logo.png");
//        使图片旋转90度
       BufferedImage simage = RotateImage.Rotate(src,0);
       Image image = simage;
//        获取图片的宽度
       int width=image.getWidth(c);
//        获取图片的高度
       int height2=image.getHeight(c);
       //todo 这里是否是设置图片的宽度和高度
        g2.drawImage(src,(int)x,40,c); //打印原图 ,因为图片的原宽度超出了纸张，所以打印机会报错误
		//**************************************************************************************//
 
 
 
        //设置标题  
		//g2.drawString("名称",(float)x+20, (float)y+line);
		//g2.drawString("单价",(float)x+60, (float)y+line);
		//g2.drawString("数量",(float)x+90, (float)y+line);
		//g2.drawString("小计",(float)x+120, (float)y+line);
//		line+=heigth;
 
		/*
		 * 虚线绘制设置    setStroke(Stroke):为 Graphics2D 上下文设置 Stroke
		 * 由 BasicStroke定义的呈现属性描述了用画笔沿 Shape 的轮廓绘制的某个标记的形状，以及应用在 Shape 路径线段的末端和连接处的装饰。
		 * 这些呈现属性包括： 
		 * width：画笔的宽度，是垂直于画笔轨迹的测量值。  此宽度必须大于或等于 0.0f，0.0f为最细线条。  
		 * end caps：在未封闭子路径和虚线线段的末端应用的一些装饰。如果子路径没有 CLOSE 段，则在同一点上开始和结束的子路径仍被认为是未封闭的。
		 * 	关于 CLOSE 段的更多信息，请参阅 SEG_CLOSE。三个不同的装饰是：
		 * 		CAP_BUTT：无装饰地结束未封闭的子路径和虚线线段。
		 * 		CAP_ROUND：使用半径等于画笔宽度一半的圆形装饰结束未封闭的子路径和虚线线段。
		 * 		CAP_SQUARE：使用正方形结束未封闭的子路径和虚线线段，正方形越过线段端点，并延长等于线条宽度一半的距离。 
		 * line joins：在两个路径线段的交汇处，以及使用 SEG_CLOSE 封闭的子路径端点的交汇处应用的装饰。
		 * 		三个不同的装饰是：
		 * 			JOIN_BEVEL：通过直线连接宽体轮廓的外角，将路径线段连接在一起。 
		 * 			JOIN_MITER：扩展路径线段的外边缘，直到它们连接在一起。 
		 * 			JOIN_ROUND：通过舍去半径为线长的一半的圆角，将路径线段连接在一起。 
		 * miter limit：对剪裁具有 JOIN_MITER 装饰的线接合点的限制。当斜接长度与笔划宽度的比大于 miterlimit 值时，需要剪裁线接合点。
		 * 		斜接长度是斜接的对角线长度，即交汇处的内棱角和外棱角之间的距离。两条线段形成的角度越小，斜接长度就越长，交汇处的角度就越尖锐。
		 * 		默认 miterlimit 值为 10.0f，它会使所有小于 11 度的角都被剪裁。剪裁斜接会使线接合点的装饰变成斜角。 必须大于或等于 1.0f。
		 * dash attributes：关于如何通过在不透明和透明部分之间交替形成一个虚线模式的定义。 表示虚线模式的数组  
		 * dash phase - 开始虚线模式的偏移量  
		 */
		//虚线设置
//		g2.setStroke(new BasicStroke(1f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,4.0f,new float[]{4.0f},0.0f));
		//在此图形上下文的坐标系中使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 即绘制虚线
//		g2.drawLine((int)x,(int)(y+line),(int)x+158,(int)(y+line));
//		line+=heigth;
		//设置商品清单
		if(update != null){
			int rowX = 20;
			int lineY = 65;

			g2.drawString("物料名称:",(float)x+rowX,(float)y+line);
			if(update.getGoodsName().length() -42 > 0){
				g2.drawString(update.getGoodsName().substring(0,21),(float)x+lineY, (float)y+line);
				line+=heigth;
				g2.drawString(update.getGoodsName().substring(21,42),(float)x+lineY, (float)y+line);
				line+=heigth;
				g2.drawString(update.getGoodsName().substring(42,52)+"...",(float)x+lineY, (float)y+line);
				line+=heigth;
			}else if(update.getGoodsName().length() -21 > 0){
				g2.drawString(update.getGoodsName().substring(0,21),(float)x+lineY, (float)y+line);
				line+=heigth;
				g2.drawString(update.getGoodsName().substring(21),(float)x+lineY, (float)y+line);
				line+=heigth;
			}else{
				g2.drawString(update.getGoodsName(),(float)x+lineY, (float)y+line);
				line+=heigth;
			}
			g2.drawString("规格型号:",(float)x+rowX,(float)y+line);
			g2.drawString(update.getSpecification(),(float)x+lineY, (float)y+line);
			line+=heigth;
			//todo 待测试
			try {
				// 定义二维码参数
				Map<EncodeHintType, Object> hints = new HashMap<>();
				// 设置字符编码
				hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

				// 使用QRCodeWriter生成条形码码矩阵信息
				MultiFormatWriter writer = new MultiFormatWriter();
				//自定义宽度和高度
				int ww = 50;
				int yy = 50;
				BitMatrix bitMatrix = writer.encode(update.getGoodsId(), BarcodeFormat.CODE_128, ww, yy, hints);

				// 创建BufferedImage对象来表示条形码
				BufferedImage iimage = new BufferedImage(ww, yy, BufferedImage.TYPE_INT_RGB);
				for (int i = 0; i < ww; i++) {
					for (int j = 0; j < yy; j++) {
						// 生成黑色条和白色背景的条形码
						iimage.setRGB(i, j, bitMatrix.get(i, j) ? 0 : 0xFFFFFF);
					}
				}
				g2.drawImage(src,(int)ww,yy,c);
			}catch (Exception e){
				log.error(e.getMessage());
			}

//			g2.drawString("物料编号/代号:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getItemcode(),(float)x+80,(float)y+line);
//			line+=heigth;
//			g2.drawString("数量:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getQuantity(),(float)x+lineY,(float)y+line);
//			line+=heigth;
//			g2.drawString("规格:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getPackSpec(),(float)x+lineY,(float)y+line);
//			line+=heigth;
//			g2.drawString("生产日期:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getProductDate(),(float)x+lineY,(float)y+line);
//			line+=heigth;
//			g2.drawString("有效期:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getShelfLife(),(float)x+lineY,(float)y+line);
//			line+=heigth;
//			g2.drawString("复验日期:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getCheckDate(),(float)x+lineY,(float)y+line);
//			line+=heigth;
//			String total1 = StringUtils.EMPTY;
////			String total2 = StringUtils.EMPTY;
//			String memoinfo1 = tWmsDataEntity.getMemoinfo1();
//			if(StringUtils.isNotBlank(memoinfo1)){
//				if(memoinfo1.contains(",")){
//					String[] split = memoinfo1.split(",");
//					total1 = split[0];
////					total2 = split[1];
//				}
//			}
//			g2.drawString("总数量:",(float)x+rowX,(float)y+line);
//			g2.drawString(total1,(float)x+lineY,(float)y+line);
//			line+=heigth;
//			g2.drawString("原始批号:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getOriginalBatchNo(),(float)x+lineY,(float)y+line);
//			line+=heigth;
//			g2.drawString("托盘号:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getStockcode(),(float)x+lineY,(float)y+line);
//			line+=heigth;
//			g2.drawString("供应商:",(float)x+rowX,(float)y+line);
//			g2.drawString(tWmsDataEntity.getProvider(),(float)x+lineY,(float)y+line);
			line+=heigth;
			g2.drawString("打印时间:",(float)x+rowX,(float)y+line);
			g2.drawString(sdf.format(new Date()),(float)x+lineY,(float)y+line);
			line += heigth;
//			g2.drawString("打印日期:",(float)x+15,(float)y+line);
//			g2.drawString(String.valueOf(sdf.format(new Date())),(float)x+60,(float)y+line);
//			line += heigth;
		}
//		g2.drawLine((int) x, (int)(y+line), (int) x + 158, (int)(y+line));
//		line += heigth+2;
//		g2.drawString("商品总数:"+"一"+ "件",(float)x+15,(float)y+line);
//		line += heigth;
		//从新设置打印图片的大小
		//g2.drawImage(image, (int)x+5,200, width,height2, c);
 
 
//		if(cardNumber!=null && !"".equals(cardNumber)){
//			g2.drawString("当前会员:"+cardNumber,(float)x+15,(float)y+line);
//			line += heigth;
//			g2.drawString("积分:"+integral,(float)x+15,(float)y+line);
//		}

//		line += heigth;
//		g2.drawString("钱票请当面点清，离开柜台恕不负责",(float)x+15,(float)y+line);
		switch (pageIndex) {  
		case 0:  
			return PAGE_EXISTS;  //0 
		default:  
			return NO_SUCH_PAGE;   //1
		}  
	}

}