namespace ESCPOS_NET.Emitters
{
    public interface ICommandEmitter
    {
        /* Print Commands */
        byte[] PrintLine(string line = null);

        byte[] Print(string line);

        byte[] FeedLines(int lineCount);

        byte[] FeedLinesReverse(int lineCount);

        byte[] FeedDots(int dotCount);

        /* Line Spacing Commands */
        byte[] ResetLineSpacing();

        byte[] SetLineSpacingInDots(int dots);

        /* Operational Commands */
        byte[] Initialize();

        byte[] Enable();

        byte[] Disable();

        /* Cash Drawer Commands */
        byte[] CashDrawerOpenPin2(int pulseOnTimeMs = 120, int pulseOffTimeMs = 240);

        byte[] CashDrawerOpenPin5(int pulseOnTimeMs = 120, int pulseOffTimeMs = 240);

        /* Character Commands */
        byte[] SetStyles(PrintStyle style);

        byte[] LeftAlign();

        byte[] RightAlign();

        byte[] CenterAlign();

        byte[] ReverseMode(bool activate);

        byte[] RightCharacterSpacing(int spaceCount);

        byte[] UpsideDownMode(bool activate);

        byte[] CodePage(CodePage codePage);

        byte[] Color(Color color);

        /* Action Commands */
        byte[] FullCut();

        byte[] PartialCut();

        byte[] FullCutAfterFeed(int lineCount);

        byte[] PartialCutAfterFeed(int lineCount);

        /* Image Commands */
        byte[] SetImageDensity(bool isHiDPI);

        byte[] BufferImage(byte[] image, int maxWidth, bool isLegacy = false, int color = 1);

        byte[] WriteImageFromBuffer();

        byte[] PrintImage(byte[] image, bool isHiDPI, bool isLegacy = false, int maxWidth = -1, int color = 1);

        /* Status Commands */
        byte[] EnableAutomaticStatusBack();

        byte[] EnableAutomaticInkStatusBack();

        /* Barcode Commands */
        byte[] PrintBarcode(BarcodeType type, string barcode, BarcodeCode code = BarcodeCode.CODE_B);

        byte[] PrintQRCode(string data, TwoDimensionCodeType type = TwoDimensionCodeType.QRCODE_MODEL2, Size2DCode size = Size2DCode.NORMAL, CorrectionLevel2DCode correction = CorrectionLevel2DCode.PERCENT_7);

        byte[] Print2DCode(TwoDimensionCodeType type, string data, Size2DCode size = Size2DCode.NORMAL, CorrectionLevel2DCode correction = CorrectionLevel2DCode.PERCENT_7);

        byte[] SetBarcodeHeightInDots(int height);

        byte[] SetBarWidth(BarWidth width);

        byte[] SetBarLabelPosition(BarLabelPrintPosition position);

        byte[] SetBarLabelFontB(bool fontB);

        /* 2D-Code Commands */
    }
}
