package com.neptune.plugin;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;

import com.getcapacitor.JSObject;
import com.getcapacitor.PluginCall;
import com.neptune.modules.Printer;
import com.neptune.plugin.models.PrintBlockModel;
import com.neptune.utils.MyLog;
import com.pax.dal.entity.EFontTypeExtCode;
import com.pax.dal.exceptions.PrinterDevException;

import org.json.JSONArray;
import org.json.JSONException;

public class NeptunePrinterHandler {

    public static void print(PluginCall call) {
        MyLog.logI("Starting getPinBLock");
        JSObject ret = new JSObject();
        JSObject req = call.getData();
        try {
            JSONArray array = req.getJSONArray("value");
            Printer.getInstance().init();
            for (int i = 0; i < array.length(); i++) {
                PrintBlockModel block = new PrintBlockModel(array.getJSONObject(i));
                PrintBlockMgmt(block);
            }
            ret.put("value", Printer.getInstance().start());
            call.resolve(ret);
        } catch (JSONException e) {
            MyLog.logE(e.getMessage());
            call.reject(e.getMessage(), e);
        } catch (PrinterDevException e) {
            call.reject(e.getMessage(), e);
        }
    }

    private static void PrintBlockMgmt(PrintBlockModel block) throws PrinterDevException {

        if (block.getType() == PrintBlockModel.PrintBlockType.BITMAP) {

            final String pureBase64Encoded = block.getData()[0].substring(block.getData()[0].indexOf(",") + 1);
            final byte[] decodedBytes = Base64.decode(pureBase64Encoded, Base64.DEFAULT);
            Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
            Printer.getInstance().printBitmap(decodedBitmap);
        } else {

            Printer.getInstance().fontSet(
                    block.getAsciiFontType(),
                    EFontTypeExtCode.FONT_16_16);

            Printer.getInstance().spaceSet(
                    (byte) block.getWordSpace(),
                    (byte) block.getLineSpace()
            );

            Printer.getInstance().leftIndents(
                    (short) block.getLeftIndent()
            );

            Printer.getInstance().setGray(
                    block.getGreyLevel()
            );

            if (block.isDoubleWidth()) {
                Printer.getInstance().setDoubleWidth(true, true);
            }
            if (block.isDoubleHeight()) {
                Printer.getInstance().setDoubleHeight(true, true);
            }

            Printer.getInstance().setInvert(block.isInvert());

            for (int i = 0; i < block.getData().length; i++) {
                String str = block.getData()[i];
                if (str != null && str.length() > 0) {
                    Printer.getInstance().printStr(str, null);
                    Printer.getInstance().step(block.getStep());
                }
            }

        }

    }


}
