package com.step.upon;


import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import java.util.List;
import com.step.upon.LameEngine;



import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.*;

import org.apache.cordova.PermissionHelper;
import android.Manifest;


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

import android.content.pm.PackageManager;
import java.security.Permission;


import java.util.ArrayList;

import com.step.upon.RecorderUtility;

import static org.apache.cordova.media.AudioHandler.PERMISSION_DENIED_ERROR;


public class upon extends CordovaPlugin {

    public static String [] permissions = { Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE};

    public static int RECORD_AUDIO = 0;
    public static int WRITE_EXTERNAL_STORAGE = 1;

    private CallbackContext messageChannel;
    private RecorderUtility utility = null;

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


    @Override
    public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
		if (action.equals("requestPermision")) { //申请权限
           this.messageChannel = callbackContext;
            promptForPerssion();


        } else if (action.equals("mp3ToWav")) {
         	PluginResult result = new PluginResult(PluginResult.Status.OK,"success");
            callbackContext.sendPluginResult(result);
            return true;

        } else if (action.equals("amrToWav")) {
            PluginResult result = new PluginResult(PluginResult.Status.OK, "success");
            callbackContext.sendPluginResult(result);
            return true;

        } else if (action.equals("startWavRecord")) {
            this.messageChannel = callbackContext;
            this.utility = null;
            this.utility = new RecorderUtility();

            String filePath = args.getString(0).trim();
            if (filePath.length() == 0) {
                PluginResult result = new PluginResult(PluginResult.Status.ERROR, "File name Empty");
                callbackContext.sendPluginResult(result);
                return false;
            }

            boolean ret = this.utility.startWavRecord(filePath);
            if (ret) {
                PluginResult result = new PluginResult(PluginResult.Status.OK, "Recorder start success");
                callbackContext.sendPluginResult(result);
                return true;

            } else {
                PluginResult result = new PluginResult(PluginResult.Status.ERROR, "Record start Failed");
                callbackContext.sendPluginResult(result);
                return true;
            }

        } else if (action.equals("stopWavRecord")) {
            boolean ret = this.utility.stopWavRecord();

            if (ret) {
                PluginResult result = new PluginResult(PluginResult.Status.OK, "recorder stop success");
                callbackContext.sendPluginResult(result);

            } else {
                PluginResult result = new PluginResult(PluginResult.Status.ERROR, "recorder stop error");
                callbackContext.sendPluginResult(result);
            }

            return true;

        } else if (action.equals("jniTest")) {
            String info = LameEngine.jniTest();
            PluginResult result = new PluginResult(PluginResult.Status.OK, info);
            callbackContext.sendPluginResult(result);
            return true;

        } else if (action.equals("getHotSpotInfo")) {
        	String hotSpotName = "test";
        	PluginResult result = new PluginResult(PluginResult.Status.OK, hotSpotName);
            callbackContext.sendPluginResult(result);

            return true;


        } else {
         	callbackContext.error("Can not find the function");
            return false;
        }

        return true;
    }

    public void onRequestPermissionResult(int requestCode, String[] permissions,
                                          int[] grantResults) throws JSONException
    {
        for(int r:grantResults) {
            if(r == PackageManager.PERMISSION_DENIED) {
                this.messageChannel.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, PERMISSION_DENIED_ERROR));
                return;
            }
        }
        this.promptForPerssion();
    }


    protected void getWritePermission(int requestCode) {

        PermissionHelper.requestPermission(this, requestCode, permissions[WRITE_EXTERNAL_STORAGE]);
    }


    protected void getMicPermission(int requestCode) {
        PermissionHelper.requestPermission(this, requestCode, permissions[RECORD_AUDIO]);
    }


    private void promptForPerssion()
    {
        if(PermissionHelper.hasPermission(this, permissions[WRITE_EXTERNAL_STORAGE])  && PermissionHelper.hasPermission(this, permissions[RECORD_AUDIO])) {
            this.messageChannel.sendPluginResult(new PluginResult(PluginResult.Status.OK, "success"));
            return;

        } else if(PermissionHelper.hasPermission(this, permissions[RECORD_AUDIO])) {
            getWritePermission(WRITE_EXTERNAL_STORAGE);

        } else {
            getMicPermission(RECORD_AUDIO);
        }

    }



}
