import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaInterface;
import android.util.Log;
import android.provider.Settings;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;
import android.view.KeyEvent;

import java.util.HashMap;
import java.util.Iterator;

import android.content.Intent;

import org.json.JSONException;
import org.json.JSONObject;

import org.apache.cordova.PluginResult;

import co.za.vectra.cordova.scannerplugin.*;

/**
* Plugin to launch operate the Scanner device on Blade2.
*
* The input JSON structure as per below:
* [{
*   keyUp: false,
*   keyCode: 57,
*   mustPlayBeep: true
* }]
*
* The response from the plugin has JSON structure as per below:
* {
*   event_type: 'scann_success',
*   code_len: 10,
*   code: '1234567890'
* }
*
* @author Tehan Uys
*/

public class VectraScannerPlugin extends CordovaPlugin implements ThirdPartyScanListener {
  public CallbackContext callbackContext;

  public VectraScannerPlugin() {}

  public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    super.initialize(cordova, webView);
  }

  public boolean execute(final String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    this.callbackContext = callbackContext;

    Log.d("VectraScannerPlugin", "execute called...");
    try {
      ThirdPartyScanController.getInstance().setScanListener(this);

      JSONObject obj = args.getJSONObject(0);
      int keyCode = obj.getInt("keyCode");
      boolean keyUp = obj.getBoolean("keyUp");
      boolean mustPlayBeep = obj.getBoolean("mustPlayBeep");

      Log.d("VectraScannerPlugin", "handlePossibleScanEvent...");
      ThirdPartyScanController.getInstance().handlePossibleScanEvent(
        cordova.getActivity(),
        keyUp ? KeyEvent.ACTION_UP : KeyEvent.ACTION_DOWN,
        keyCode,
        mustPlayBeep
      );
      Log.d("VectraScannerPlugin", "handlePossibleScanEvent done.");
    } catch (Exception ex) {
      callbackContext.error(ex.getMessage());
      Log.e("VectraScannerPlugin", ex.getMessage(), ex);
      return true;
    }

    PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
    r.setKeepCallback(true);
    callbackContext.sendPluginResult(r);

    return true;
  }

  @Override
  public void onInitialised() {
    Log.d("VectraScannerPlugin", "Scan initialised");
  }

  @Override
  public void onScanStarted() {
    Log.d("VectraScannerPlugin", "Scan trigger pressed");
  }

  @Override
  public void onScanSuccess(int len, String code) {
    Log.d("VectraScannerPlugin", "Bar code scanned: " + code);
    try {
      createScanResponse("scan_success", len, code);
    } catch (Exception ex) {
      callbackContext.error(ex.getMessage());
    }
  }

  @Override
  public void onScanStopped() {
    Log.d("VectraScannerPlugin", "Scan trigger released");
    try {
      createScanResponse("scan_stopped", -1, null);
    } catch (Exception ex) {
      callbackContext.error(ex.getMessage());
    }
  }

  @Override
  public void onDisconnect() {
      Log.d("VectraScannerPlugin", "Scan service disconnected");
  }

  /**
  * Method to create a JSON structure to return to the calling app
  *
  * @param eventType i.e. scan_started, scan_success, scan_stopped
  * @param codeLen the lengh of the code if event = scan_success
  * @param code the scan code if event = scan_success
  */
  private void createScanResponse(String eventType, int codeLen, String code) throws JSONException {
    JSONObject root = new JSONObject();
    root.put("event_type", eventType);

    if (code != null) {
      root.put("code_len", codeLen);
      root.put("code", code);
    }

    this.callbackContext.success(root);
  }
}
