package com.harvard.innerprinter;

import android.os.Bundle;
import android.os.RemoteException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.ReadableNativeMap;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import com.harvard.innerprinter.PrinterManager;

import android.view.View;
import android.app.Activity;
import com.harvard.innerprinter.utils.LogUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;

public class HarvardInnerPrinterModule extends ReactContextBaseJavaModule  implements PrinterManager.PrinterManagerListener {

    private final ReactApplicationContext reactContext;
    // private static final Map<String, Promise> promiseMap = Collections.synchronizedMap(new HashMap<String, Promise>());
    private PrinterManager mPrinterManager;
    public int fontSize = 24;
    public int typeFace=0;

    final Map<String,Integer> printAttrMap = new HashMap<String,Integer>();
    final Map<String,Integer> printColumnStrMap = new HashMap<String,Integer>();
    
   
    public HarvardInnerPrinterModule(ReactApplicationContext reactContext){
      super(reactContext);
      this.reactContext = reactContext;
      startPrintService();
    //   setDefaultAttr();
    }
    public void setDefaultAttr(){

    }

    @Override
    public String getName() {
        return "HarvardInnerPrinter";
    }

 
    @ReactMethod
    public void checkCard() {
        LogUtil.e("TAG", "cek kartu");
    }
    @ReactMethod
    public void setFontSize(int size, final Promise p) {
        try {
            fontSize = size;
            p.resolve(null);
        } catch(Exception e){
            p.reject("0",  "gagal");
        }
    }
    @ReactMethod
    public void setBold(int size, final Promise p) {
        try {
            typeFace = size;
            p.resolve(null);
        } catch(Exception e){
            p.reject("0",  "gagal");
        }
    }
    @ReactMethod
    public void startPrintService() {
        Activity currentActivity = getCurrentActivity();
        mPrinterManager = new PrinterManager( currentActivity, this, this.reactContext);
        mPrinterManager.onPrinterStart();
    }
    @ReactMethod
    public void onDestroy() {
        mPrinterManager.onPrinterStop();
    }
    @ReactMethod
    public void PrintText(final String text, int align, final Promise p) {
        printAttrMap.put(mPrinterManager.KEY_ALIGN, align);
        printAttrMap.put(mPrinterManager.KEY_LINESPACE,0);
        printAttrMap.put(mPrinterManager.KEY_TEXTSIZE,fontSize);
        printAttrMap.put(mPrinterManager.KEY_TYPEFACE, typeFace);
        printAttrMap.put(mPrinterManager.KEY_MARGINLEFT, 5);
        printAttrMap.put(mPrinterManager.KEY_MARGINRIGHT, 5);

        ThreadPoolManager.getInstance().executeTask(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    mPrinterManager.printTextWithAttributes(text, printAttrMap);
                    p.resolve(null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    // e.printStackTrace();
                    p.reject("0",  "gagal");
                }
            }
        });
    }
    @ReactMethod
    public void PrintOriginalText(final String text, final Promise p) {
        ThreadPoolManager.getInstance().executeTask(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    mPrinterManager.printText(text);
                    p.resolve(null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    // e.printStackTrace();
                    p.reject("0",  "gagal");
                }
            }
        });
    }
    @ReactMethod
    public void PrintColumnText(ReadableArray colsTextArr, ReadableArray weight,ReadableArray alignText, final Promise p) {
        final Map<String,Integer> printColumnAttrMap = new HashMap<String,Integer>();
        final Map<String,Integer> attrCols1Map1 = new HashMap<String,Integer>();
        attrCols1Map1.put(PrinterManager.KEY_LINESPACE,0);
        attrCols1Map1.put(PrinterManager.KEY_TEXTSIZE,fontSize);
        attrCols1Map1.put(PrinterManager.KEY_ALIGN, 1);
        attrCols1Map1.put(PrinterManager.KEY_TYPEFACE, typeFace);
        final Map<String,Integer> attrCols1Map2 = new HashMap<String,Integer>();
        attrCols1Map2.put(PrinterManager.KEY_LINESPACE,0);
        attrCols1Map2.put(PrinterManager.KEY_TEXTSIZE,fontSize);
        attrCols1Map2.put(PrinterManager.KEY_TYPEFACE, typeFace);
        final Map<String,Integer> attrCols1Map3 = new HashMap<String,Integer>();
        attrCols1Map3.put(PrinterManager.KEY_LINESPACE,0);
        attrCols1Map3.put(PrinterManager.KEY_TEXTSIZE,fontSize);
        attrCols1Map3.put(PrinterManager.KEY_TYPEFACE, typeFace);
        final Map<String,Integer> attrCols1Map4 = new HashMap<String,Integer>();
        attrCols1Map4.put(PrinterManager.KEY_LINESPACE,0);
        attrCols1Map4.put(PrinterManager.KEY_TEXTSIZE,fontSize);
        attrCols1Map4.put(PrinterManager.KEY_TYPEFACE, typeFace);

        final String[] cols1Texts = new String[colsTextArr.size()];
        for (int i = 0; i < colsTextArr.size(); i++) {
            cols1Texts[i] = colsTextArr.getString(i);
        }
        final List attrCols1 = new ArrayList();
        for (int i = 0; i < alignText.size(); i++) {
            LogUtil.e("I nya adalah","ke"+i);
            if(i == 0){
                attrCols1Map1.put(PrinterManager.KEY_ALIGN, alignText.getInt(i));
                attrCols1Map1.put(PrinterManager.KEY_WEIGHT, weight.getInt(i));
                attrCols1.add(attrCols1Map1);
            } else if(i == 1){
                attrCols1Map2.put(PrinterManager.KEY_ALIGN, alignText.getInt(i));
                attrCols1Map2.put(PrinterManager.KEY_WEIGHT, weight.getInt(i));
                attrCols1.add(attrCols1Map2);
            } else if(i == 2){
                attrCols1Map3.put(PrinterManager.KEY_ALIGN, alignText.getInt(i));
                attrCols1Map3.put(PrinterManager.KEY_WEIGHT, weight.getInt(i));
                attrCols1.add(attrCols1Map3);
            } else if(i == 3){
                attrCols1Map4.put(PrinterManager.KEY_ALIGN, alignText.getInt(i));
                attrCols1Map4.put(PrinterManager.KEY_WEIGHT, weight.getInt(i));
                attrCols1.add(attrCols1Map4);
            } else {
                attrCols1.add(attrCols1Map1);
            }
            
        }
        ThreadPoolManager.getInstance().executeTask(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    mPrinterManager.printColumnsTextWithAttributes(cols1Texts, attrCols1);
                    p.resolve(null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    // e.printStackTrace();
                    p.reject("0",  "gagal");
                }
            }
        });
    }

    @ReactMethod
    public void printBarCode(final String barCode, final int width,final int height, final int align, boolean showText, final Promise p){
        ThreadPoolManager.getInstance().executeTask(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    mPrinterManager.printBarCode(barCode,align, width, height, false);
                    p.resolve(null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    p.reject("0",  "gagal");
                }
            }
        });
    }
    @ReactMethod
    public void printQRCode(final String qrCode, final int width, final int align, final Promise p){
        ThreadPoolManager.getInstance().executeTask(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    mPrinterManager.printQRCode(qrCode, align, width);
                    p.resolve(null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    p.reject("0",  "gagal");
                }
            }
        });
    }
    @ReactMethod
    public void printImage(final String encodedImage, final int align, final Promise p){
        byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
        final Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 

        final Map<String,Integer> map = new HashMap<String,Integer>();
        map.put(PrinterManager.KEY_ALIGN, align);
        map.put(PrinterManager.KEY_MARGINLEFT, 5);
        map.put(PrinterManager.KEY_MARGINRIGHT, 5);
        ThreadPoolManager.getInstance().executeTask(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    mPrinterManager.printBitmap(bitmap,map);
                    p.resolve(null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    p.reject("0",  "gagal");
                }
            }
        });
    }
    @Override
    public void onServiceConnected() {
        mPrinterManager.printerInit();
        LogUtil.e("TAG", "Printer Terhubung");
        // updateLayout(true);
    }

}

