package com.neptune.plugin;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.util.Base64;

import com.getcapacitor.JSObject;
import com.getcapacitor.PluginCall;
import com.neptune.base.NeptuneAppMgmt;
import com.neptune.modules.GLPrinter;
import com.neptune.modules.Printer;
import com.neptune.plugin.models.GLPageLineModel;
import com.neptune.plugin.models.GLPageModel;
import com.neptune.plugin.models.GLPageUnitModel;
import com.neptune.utils.MyLog;
import com.pax.dal.exceptions.PrinterDevException;
import com.pax.gl.page.IPage;

import org.json.JSONException;

import java.util.Iterator;

public class NeptuneGLPagePrinter {

    public static void pagePrint(PluginCall call) {
        MyLog.logI("Starting pagePrint");
        JSObject ret = new JSObject();
        JSObject req = call.getData();

        try {
            GLPageModel page = new GLPageModel(req.getJSONObject("value"));
            Bitmap bitmap = pageHandler(page);
            Printer.getInstance().init();
            Printer.getInstance().printBitmap(bitmap);
            ret.put("value", Printer.getInstance().start());
            call.resolve(ret);
        } catch (JSONException e) {
            MyLog.logE(e.getMessage());
            call.reject(e.getMessage(), e);
        }
        catch (PrinterDevException e) {
            MyLog.logE(e.getMessage());
            call.reject(e.getMessage(), e);
        }

    }

    private static Bitmap pageHandler(GLPageModel pageModel) {
        IPage page = GLPrinter.getInstance().createPage();
        page.setTypefaceObj(Typeface.createFromAsset(NeptuneAppMgmt.getAppContext().getAssets(), "fonts/" + pageModel.getFont().getFile()));
        Iterator<GLPageLineModel> iterator = pageModel.getLines().iterator();
        while (iterator.hasNext()) {
            lineHandler(page, iterator.next());
        }

        return GLPrinter.getInstance().pageToBitmap(page, 384);

    }

    private static void lineHandler(IPage page, GLPageLineModel lineModel) {
        Iterator<GLPageUnitModel> iterator = lineModel.getUnits().iterator();
        IPage.ILine line = page.addLine().adjustTopSpace(lineModel.getTop());

        while (iterator.hasNext()) {
            unitHandler(line, iterator.next());
        }

    }

    private static void unitHandler(IPage.ILine line, GLPageUnitModel unit) {
        if(unit.getType() == GLPageUnitModel.PageUnitType.BITMAP) {
            line.addUnit(dataToBitmap(unit.getData()), unit.getAlign());
        }else{
            line.addUnit(
                    unit.getData(),
                    unit.getFontSize(),
                    unit.getAlign(),
                    unit.getStyle().getVaule()
                    );
        }
    }

    private static Bitmap dataToBitmap(String data){
        final String pureBase64Encoded = data.substring(data.indexOf(",") + 1);
        final byte[] decodedBytes = Base64.decode(pureBase64Encoded, Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
    }

}
