package support;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.impl.code128.Code128Constants;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
public class Label implements Printable {
	
	private double spaceFromTop;				//Distance border top to border top first label (first top-left)
	private double spaceFromLeft;				//Distance border left to border left first label (first top-left)
	private double ofsX;						//Label Offset Y
	private double ofsY;						//Label Offset Y
	private double iofsX;						//Object Offset X 
	private double iofsY;						//Object Offset Y
	private double labelHeight;					//Altezza della label
	private int labelWidth;						//Larghezza della label
	private int qtyLabelOnPage;					//Quantita' di label presenti nel foglio
	private int dpi;
	private boolean borderOn = false;
	private ArrayList<ArrayList<String>> info;	//Records/Fields
	
	public Label(double marginX, double marginY, ArrayList<ArrayList<String>> info, int dpi, boolean borderOn) {		
		this.borderOn = borderOn;
		this.labelHeight = 90;						//Altezza della label
		this.labelWidth = 165;						//larghezza della label
		this.qtyLabelOnPage = info.size();			//Quantita' di label presenti nel foglio deve corrispondere con la dimensione dell'array dati
		this.spaceFromTop = 19f;					//Distanza della Label dal bordo superiore del foglio
		this.spaceFromLeft = 25f;					//Distanza della Label dal bordo sinistro del foglio
		if((this.spaceFromTop-marginY) > marginY) {			//Offset della label verticale
			this.ofsY = this.spaceFromTop - marginY;
		} else {
			this.ofsY = marginY;	
		}
		if((this.spaceFromLeft-marginX) > marginX) {			//Offset della label orizzontale
			this.ofsX = this.spaceFromLeft - marginX;	
		} else {
			this.ofsX = marginX;	
		}
		this.iofsX = 15;								//Offset di posizione per tutti gli oggetti stampati
		this.iofsY = 10;								//Offset di posizione per tutti gli oggetti stampati		
		this.info = info;
		this.dpi = dpi;
	}
	
	private double offSetX() {
		return ofsX + iofsX;
	}
	
	private double offSetY(int index) {
		return ofsY + iofsY + labelHeight*index; 
	}
	/**
	 * Metodo per la generazione degli oggetti e localizzazione sulla pagina fisica.
	 */
	public int print(Graphics g, PageFormat pf, int page) {
		
		//--- Create the Graphics2D object
		Graphics2D g2d = (Graphics2D) g;
		//g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		//g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		//g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		//--- Translate the origin to 0,0 for the top left corner
		g2d.translate(pf.getImageableX(), pf.getImageableY());
		
		//System.out.println("Page n." + page);
		
		//Dichiarazioni dei fonts da utilizzare per i testi
		Font f1 = new Font("Times New Roman", Font.BOLD, 16);
		Font f2 = new Font("Times New Roman", Font.PLAIN, 10);
		Font f3 = new Font("Arial", Font.BOLD, 10);
		Font f4 = new Font("Arial", Font.BOLD, 12);
		Font f5 = new Font("Arial", Font.PLAIN, 10);
		Font f6 = new Font("Arial", Font.BOLD, 10);
		
		for(int itemData = 0; itemData < qtyLabelOnPage; itemData++) {
			//Composizione dei dati			
			String address2 = info.get(itemData).get(5) + " " + info.get(itemData).get(6) + " " + info.get(itemData).get(7);			//String	ADDRESS2 Composizione
			//String cmr = "SDA: " + info.get(itemData).get(28);
			String packing = " BOX " + info.get(itemData).get(9) + "/" + info.get(itemData).get(10);
			String quantity = " QTY: " + info.get(itemData).get(11);				
			String barcodeData = info.get(itemData).get(13);															//String	BARCODE Composizione ID_Correlation
			if(this.borderOn==true) {
				g2d.drawRect(UnitConv.mm2px(ofsX, dpi), UnitConv.mm2px(ofsY + labelHeight*itemData, dpi), UnitConv.mm2px(this.labelWidth, dpi), UnitConv.mm2px(this.labelHeight, dpi));
			}
			
			//Inizializzazione Font e inserimento stringa di stampa I/OFFSET Pos X, DPI                     I/OFFSET Pos Y, DPI
			g2d.setFont(f1); g2d.drawString("Mia Società",					UnitConv.mm2px(this.offSetX() + 00, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 10, dpi));	//String	BANCASELLA		
			g2d.setFont(f2); g2d.drawString("SOC s.r.l.",					UnitConv.mm2px(this.offSetX() + 90, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 10, dpi));	//String	STM		
			g2d.setFont(f3); g2d.drawString("ID RAC",						UnitConv.mm2px(this.offSetX() + 0, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 14, dpi));	//String	ID_GROUP
			g2d.setFont(f4); g2d.drawString(info.get(itemData).get(1),		UnitConv.mm2px(this.offSetX() + 20, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 14, dpi));	//Value		ID_GROUP
			g2d.setFont(f5); g2d.drawString("Destinazione:",				UnitConv.mm2px(this.offSetX() + 50, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 22, dpi));	//String	Destinazione
			g2d.setFont(f5); g2d.drawString(info.get(itemData).get(2),		UnitConv.mm2px(this.offSetX() + 80, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 22, dpi));	//Value		CO
			g2d.setFont(f5); g2d.drawString(info.get(itemData).get(3),		UnitConv.mm2px(this.offSetX() + 80, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 26, dpi));	//Value		NOMINATIVO
			g2d.setFont(f5); g2d.drawString(info.get(itemData).get(4),		UnitConv.mm2px(this.offSetX() + 80, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 30, dpi));	//Value		INDIRIZZO1
			g2d.setFont(f5); g2d.drawString(address2,						UnitConv.mm2px(this.offSetX() + 80, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 34, dpi));	//Value		POSTAL CODE + CITY + PROVINCE
			
			g2d.setFont(f5); g2d.drawString(info.get(itemData).get(12).substring(0, 8),	UnitConv.mm2px(this.offSetX() + 00, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 43, dpi));	//Value		CMR
			g2d.setFont(f5); g2d.drawString(info.get(itemData).get(12).substring(8),	UnitConv.mm2px(this.offSetX() + 49, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 43, dpi));	//Value		CMR
			g2d.setFont(f5); g2d.drawString(packing,									UnitConv.mm2px(this.offSetX() + 100, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 43, dpi));	//Value		BOX/TOTBOX
			g2d.setFont(f5); g2d.drawString(quantity,									UnitConv.mm2px(this.offSetX() + 100, dpi),	UnitConv.mm2px(this.offSetY(itemData) + 47, dpi));	//Value		QTY
			g2d.setFont(f6); g2d.drawString(info.get(itemData).get(13).substring(1, 16),UnitConv.mm2px(this.offSetX() + 00, dpi), 	UnitConv.mm2px(this.offSetY(itemData) + 47, dpi));	//Value		ID_CORRELATION Start
			g2d.setFont(f6); g2d.drawString(info.get(itemData).get(13).substring(16),	UnitConv.mm2px(this.offSetX() + 49, dpi), 	UnitConv.mm2px(this.offSetY(itemData) + 47, dpi));	//Value		ID_CORRELATION End
			
			//Stampa del barcode riportante ID_CORRELATION StartID_CORRELATION End (16+16 digit) come immagine
			Code128Bean barcode128Bean = new Code128Bean();
			barcode128Bean.setCodeset(Code128Constants.CODESET_A);
			
			//Configure the barcode generator adjust barcode width here
			final double moduleWidth = 1f;
			barcode128Bean.setModuleWidth(UnitConv.in2mm(moduleWidth / dpi));
			barcode128Bean.doQuietZone(false);
			barcode128Bean.setBarHeight(10);
			barcode128Bean.setFontName("ARIAL");
			barcode128Bean.setFontSize(5);
			
			try {
				BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
				barcode128Bean.generateBarcode(canvas, barcodeData);
				canvas.finish();
				BufferedImage image = canvas.getBufferedImage();
				g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
				g2d.drawImage(image, UnitConv.mm2px(this.offSetX(),dpi), UnitConv.mm2px(this.offSetY(itemData) + 48,dpi), image.getWidth(), image.getHeight(), null);
			} catch (IOException e2) {
				JOptionPane.showMessageDialog(null, e2.getMessage());
				return (NO_SUCH_PAGE);
			}
		}
		return (PAGE_EXISTS);
	}
	
}