package com.greact;

import com.facebook.react.bridge.Arguments;
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.Callback;

import android.util.Log;

import java.io.File;

import com.acrcloud.rec.sdk.ACRCloudConfig;
import com.acrcloud.rec.sdk.ACRCloudClient;
import com.acrcloud.rec.sdk.IACRCloudListener;

import com.facebook.react.bridge.ReadableMap;

public class GreactAcrCloud implements IACRCloudListener {
    private ACRCloudClient mClient;
	private ACRCloudConfig mConfig;
	
	private boolean mProcessing = false;
	private boolean initState = false;
	
	private Callback successCallback;
	private Callback errorCallback;

    public GreactAcrCloud(ReadableMap options) {
        this.mConfig = new ACRCloudConfig();
        this.mConfig.acrcloudListener = this;

        this.mConfig.host = options.getString("host");
        this.mConfig.accessKey = options.getString("accessKey");
        this.mConfig.accessSecret = options.getString("accessSecret");

		if(options.hasKey("timeout")) {
			this.mConfig.requestTimeout = options.getInt("timeout");
		}

        this.mConfig.protocol = ACRCloudConfig.ACRCloudNetworkProtocol.PROTOCOL_HTTP;
        this.mConfig.reqMode = ACRCloudConfig.ACRCloudRecMode.REC_MODE_REMOTE;

        this.mClient = new ACRCloudClient();
        this.initState = this.mClient.initWithConfig(this.mConfig);
    }

    @ReactMethod
    public void start(final Callback successCallback, final Callback errorCallback) {
		if(this.initState) {
			this.successCallback = successCallback;
			this.errorCallback = errorCallback;
			this.mProcessing = true;

			this.mClient.startRecognize();
		} else {
			this.errorCallback.invoke("Fail to start recognising");
		}
    }

    @Override
	public void onResult(String result) {
		if (this.mClient != null) {
			this.mClient.cancel();
			this.mProcessing = false;
		}

		this.successCallback.invoke(result);
	}

	@Override
	public void onVolumeChanged(double volume) {
	}

	public void stop() {
		if (this.mProcessing && this.mClient != null) {
			this.mClient.stopRecordToRecognize();
		}
		this.mProcessing = false;
	}
	
	public void cancel() {
		if (this.mProcessing && this.mClient != null) {
			this.mProcessing = false;
			this.mClient.cancel();
		} 		
	}

/*	@Override  
    protected void onDestroy() {  
        super.onDestroy();
        if (this.mClient != null) {
        	this.mClient.release();
        	this.initState = false;
        	this.mClient = null;
        }
    }*/
}