package com.qianmi.hardwarekit.purong;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbManager;
import android.util.Log;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.printsdk.cmd.PrintCmd;
import com.printsdk.usbsdk.UsbDriver;

/**
 * Created by xiayinglin on 27/02/2018.
 */

public class UsbPrintModule extends ReactContextBaseJavaModule {

    private UsbDriver mSerial;


    /*
    *  BroadcastReceiver when insert/remove the device USB plug into/from a USB port
    *  创建一个广播接收器接收USB插拔信息：当插入USB插头插到一个USB端口，或从一个USB端口，移除装置的USB插头
    */
    private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
                mSerial.usbAttached(intent);
                mSerial.openUsbDevice(UsbDriver.BAUD115200);
            } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                mSerial.usbDetached(intent);
            }
        }
    };

    public UsbPrintModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

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


    @ReactMethod
    public void create() {
        Log.d(getClass().getSimpleName(), "-- create --");
        getFTDriverService();
    }

    @ReactMethod
    public void destroy() {
        Log.d(getClass().getSimpleName(), "-- destroy --");
        if (null != mSerial && mSerial.isConnected()) {
            mSerial.closeUsbDevice();
        }
    }

    /**
     * printAlignLeft
     */
    @ReactMethod
    public void printAlignLeft() {
        Log.d(getClass().getSimpleName(), "-- printAlignLeft --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.SetAlignment(0));
        }
    }

    /**
     * printQrCode
     */
    @ReactMethod
    public void printQrCode(String text) {
        Log.d(getClass().getSimpleName(), "-- printQrCode --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.PrintQrcode(text, 5, 1, 0)); //
        }
    }

    /**
     * printAlignRight
     */
    @ReactMethod
    public void printAlignRight() {
        Log.d(getClass().getSimpleName(), "-- printAlignRight --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.SetAlignment(2));
        }
    }


    /**
     * setBold
     * // 粗体设置 0 1
     */
    @ReactMethod
    public void setBold(Integer bold) {
        Log.d(getClass().getSimpleName(), "-- setBold --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.SetBold(bold));
        }
    }


    /**
     * setBold
     * // 粗体设置 0 1
     */
    @ReactMethod
    public void setSizeText(Integer a0, Integer a1) {
        Log.d(getClass().getSimpleName(), "-- setSizeText --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.SetSizetext(a0, a1));
        }
    }

    /**
     * cut
     */
    @ReactMethod
    public void cut() {
        Log.d(getClass().getSimpleName(), "-- cut --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.PrintFeedline(5));      // 走纸换行
            mSerial.write(PrintCmd.PrintCutpaper(1));  // 切纸类型 0全切 1半切
            mSerial.write(PrintCmd.SetClean());            // 清理缓存
        }
    }

    /**
     * lineWrap
     */
    @ReactMethod
    public void lineWrap(Integer num) {
        Log.d(getClass().getSimpleName(), "-- lineWrap --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.PrintFeedline(num));
        }
    }

    /**
     * printAlignCenter
     */
    @ReactMethod
    public void printAlignCenter() {
        Log.d(getClass().getSimpleName(), "-- printAlignCenter --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.SetAlignment(1));
        }
    }

    /**
     * printText
     */
    @ReactMethod
    public void printText(String text) {
        Log.d(getClass().getSimpleName(), "-- printlnText --");

        if (null != mSerial) {
            mSerial.write(PrintCmd.PrintString(text, 0));
        }
    }


    /**
     * printText
     */
    @ReactMethod
    public void setLineSpace(Integer linespace) {
        Log.d(getClass().getSimpleName(), "-- setLineSpace --");
        if (null != mSerial) {
            mSerial.write(PrintCmd.SetLinespace(linespace));// 行间距
        }
    }

    /**
     * printlnText
     */
    @ReactMethod
    public void printlnText(String text) {
        Log.d(getClass().getSimpleName(), "-- printTextln --");

        if (null != mSerial) {
            mSerial.write(PrintCmd.PrintString(text + '\n', 0));
        }
    }


    @ReactMethod
    // 清理缓存，缺省模式
    private void reset() {
        Log.d(getClass().getSimpleName(), "-- reset --");
//		mSerial.write(PrintCmd.SetClean());             // 清理缓存
        mSerial.write(PrintCmd.SetBold(0));             // 粗体设置
        mSerial.write(PrintCmd.SetAlignment(0));        // 对齐方式
        mSerial.write(PrintCmd.SetSizetext(0, 0));      // 字符大小
    }


    // 清理缓存，缺省模式
    @ReactMethod
    private void clean() {
        Log.d(getClass().getSimpleName(), "-- clean --");
        mSerial.write(PrintCmd.SetClean());             // 清理缓存
    }


    private boolean getFTDriverService() {
        Log.d(getClass().getSimpleName(), "-- getFTDriverService --");
        boolean f = false;
        if (null == mSerial) {
            mSerial = new UsbDriver((UsbManager) this.getReactApplicationContext().getSystemService(Context.USB_SERVICE), this.getReactApplicationContext());
            Utils.getDriver(mSerial, mUsbReceiver, this.getReactApplicationContext());
            // 打开设备
            f = mSerial.openUsbDevice(UsbDriver.BAUD115200);
        }
        return f;
    }

}
