package zpl.model.element;

import java.awt.Font;
import java.awt.Graphics2D;

import zpl.constant.ZebraFont;
import zpl.constant.ZebraRotation;
import zpl.model.PrinterOptions;
import zpl.model.ZebraElement;
import zpl.utils.ZplUtils;

/**
 * Zebra element to add Text to specified position.
 *
 * @author ttropard
 *
 */
public class ZebraText extends ZebraElement {

    ZebraFont zebraFont = null;

    /**
     * Explain Font Size (11,13,14). Not in dots.
     */
    Integer fontSize = null;

    ZebraRotation zebraRotation = ZebraRotation.NORMAL;

    String text;

    public ZebraText(String text) {
        this.text = text;
    }

    public ZebraText(String text, int fontSize) {
        this.fontSize = fontSize;
        this.text = text;
    }

    public ZebraText(String text, ZebraFont zebraFont, int fontSize) {
        this.zebraFont = zebraFont;
        this.fontSize = fontSize;
        this.text = text;
    }

    public ZebraText(String text, ZebraFont zebraFont, int fontSize, ZebraRotation zebraRotation) {
        this.zebraFont = zebraFont;
        this.zebraRotation = zebraRotation;
        this.fontSize = fontSize;
        this.text = text;
    }

    public ZebraText(int positionX, int positionY, String text) {
        this.text = text;
        this.positionX = positionX;
        this.positionY = positionY;
    }

    public ZebraText(int positionX, int positionY, String text, int fontSize) {
        this.fontSize = fontSize;
        this.text = text;
        this.positionX = positionX;
        this.positionY = positionY;
    }

    public ZebraText(int positionX, int positionY, String text, ZebraFont zebraFont, int fontSize, ZebraRotation zebraRotation) {
        this.zebraFont = zebraFont;
        this.fontSize = fontSize;
        this.zebraRotation = zebraRotation;
        this.text = text;
        this.positionX = positionX;
        this.positionY = positionY;
    }

    public ZebraText(int positionX, int positionY, String text, ZebraFont zebraFont, int fontSize) {
        this.zebraFont = zebraFont;
        this.fontSize = fontSize;
        this.text = text;
        this.positionX = positionX;
        this.positionY = positionY;
    }

    /* (non-Javadoc)
	 * @see zpl.model.element.ZebraElement#getZplCode(zpl.model.PrinterOptions)
     */
    @Override
    public String getZplCode(PrinterOptions printerOptions) {
        StringBuffer zpl = new StringBuffer();
        zpl.append(this.getZplCodePosition());

        if (fontSize != null && zebraFont != null) {
            //This element has specified size and font
            Integer[] dimension = ZplUtils.extractDotsFromFont(zebraFont, fontSize, printerOptions.getZebraPPP());
            zpl.append(ZplUtils.zplCommand("A", zebraFont.getLetter() + zebraRotation.getLetter(), dimension[0], dimension[1]));
        } else if (fontSize != null && printerOptions.getDefaultZebraFont() != null) {
            //This element has specified size, but with default font
            Integer[] dimension = ZplUtils.extractDotsFromFont(printerOptions.getDefaultZebraFont(), fontSize, printerOptions.getZebraPPP());
            zpl.append(ZplUtils.zplCommand("A", printerOptions.getDefaultZebraFont().getLetter() + zebraRotation.getLetter(), dimension[0], dimension[1]));
        }

        zpl.append("^FH\\^FD");//We allow hexadecimal and start element
        zpl.append(ZplUtils.convertAccentToZplAsciiHexa(text));
        zpl.append(ZplUtils.zplCommandSautLigne("FS"));

        return zpl.toString();
    }

    /**
     * Used to draw label preview. This method should be overloader by child
     * class.
     *
     * Default draw a rectangle
     *
     * @param graphic
     */
    public void drawPreviewGraphic(PrinterOptions printerOptions, Graphics2D graphic) {
        if (defaultDrawGraphic) {
            int top = 0;
            int left = 0;
            if (positionX != null) {
                left = ZplUtils.convertPointInPixel(positionX);
            }
            if (positionY != null) {
                top = ZplUtils.convertPointInPixel(positionY);
            }

            Font font = null;

            if (fontSize != null && zebraFont != null) {
                //This element has specified size and font
                Integer[] dimension = ZplUtils.extractDotsFromFont(printerOptions.getDefaultZebraFont(), fontSize, printerOptions.getZebraPPP());

                font = new Font(ZebraFont.findBestEquivalentFontForPreview(zebraFont), Font.BOLD, dimension[0]);
            } else if (fontSize != null && printerOptions.getDefaultZebraFont() != null) {
                //This element has specified size, but with default font
                Integer[] dimensionPoint = ZplUtils.extractDotsFromFont(printerOptions.getDefaultZebraFont(), fontSize, printerOptions.getZebraPPP());
                font = new Font(ZebraFont.findBestEquivalentFontForPreview(printerOptions.getDefaultZebraFont()), Font.BOLD, Math.round(dimensionPoint[0] / 1.33F));
            } else {
                //Default font on Printer Zebra
                Integer[] dimensionPoint = ZplUtils.extractDotsFromFont(printerOptions.getDefaultZebraFont(), 15, printerOptions.getZebraPPP());

                font = new Font(ZebraFont.findBestEquivalentFontForPreview(ZebraFont.ZEBRA_A), Font.BOLD, dimensionPoint[0]);
            }
            drawTopString(graphic, font, text, left, top);
        }
    }
}
