package com.appstrax.cordova.plugin;

import java.util.concurrent.ExecutorService;
import org.apache.cordova.CallbackContext;

import com.appstrax.cordova.plugin.OTGDevice;
import com.appstrax.cordova.plugin.Format;

public class RunnableService {
    private boolean mScanning = false;
    private static final String COMMANDU_END = "\nU\r\n";

    public void runDataReceived(PL2303Driver pL2303Driver, ExecutorService threadPool, CallbackContext callbackContext) {
        this.mScanning = true;

        threadPool.execute(new Runnable() {
            byte[] temp = new byte[256];
            int size;
            int writeTimeout = 0;
            String readData = "";

            public void run() {
                while (mScanning && pL2303Driver.isConnected()) {
                    try {
                        if (writeTimeout > 0) {
                            this.readDataFromDriver();
                        } else {
                            this.writeDataToDriver();
                        }
                        Thread.sleep(10);
                    } catch (Throwable e) {
                        // TODO: handle when the device is unplugged
                    }
                }
            }

            public void readDataFromDriver() {
                size = pL2303Driver.read(temp);
                if (size > 0) {
                    byte[] buff = new byte[size];
                    System.arraycopy(temp, 0, buff, 0, size);
                    String strBuff = new String(buff);

                    readData += strBuff;

                    int index = readData.indexOf(COMMANDU_END);
                    if (index != -1) {
                        String data = readData.substring(0, index).replace("\n", "").replace("\r", "");
                        if (data.length() == 33) {
                            String fullData = data.replace("\n", "").replace("\r", "");
                            callbackContext.success(fullData.substring(5, 29));
                            mScanning = false;
                        }
                        writeTimeout = 0;
                        readData = "";
                    }
                } else {
                    writeTimeout--;
                }
            }

            public void writeDataToDriver() {
                StringBuilder builder = new StringBuilder();
                builder.append(Format.makesUpZero(Format.byteToHexString((byte) 0x55), 2));
                builder
                        .insert(0, Format.makesUpZero(Format.byteToHexString((byte) 0x0A), 2))
                        .append(Format.makesUpZero(Format.byteToHexString((byte) 0x0D), 2));

                String str = builder.toString();
                byte[] _data = Format.hexStringToBytes(str);
                pL2303Driver.write(_data, _data.length);

                writeTimeout = 100;
                readData = "";
            }
        });
    }

    public void stopReadWrite() {
        this.mScanning = false;
    }

}

