package org.apache.cordova.openApp;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaArgs;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Created by bamboo on 17/3/14.
 */

public class OpenApp extends CordovaPlugin {

    public static final String ACTION_OPEN_APP = "openapp";
    public static final String ACTION_CHECK_ISINSTALL = "isInstall";
    public static final String ACTION_CHECK_APPS_ISINSTALL = "appsIsInstall";


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

        Context context = this.cordova.getActivity().getApplicationContext();
        packageManager= context.getPackageManager();
    }

    @Override
    public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {
        try {

            List<PackageInfo> localPackages = cordova.getActivity().getPackageManager().getInstalledPackages(0);

            if (action.equals(ACTION_OPEN_APP)) {
                JSONObject responseJSON = new JSONObject(args.get(0)+"");
               if (checkPackInfo(responseJSON.get("packageName")+"")) {
                    Intent intent = packageManager.getLaunchIntentForPackage(responseJSON.get("packageName")+"");
                    cordova.getActivity().startActivity(intent);
                    callbackContext.success(1+"");
                    return true;
                } else {
                   for(PackageInfo packageInfo : localPackages){
                       String installedAppName = packageInfo.applicationInfo.loadLabel(cordova.getActivity().getPackageManager()).toString();
                       if(installedAppName.equals(responseJSON.get("appName")+"")&&(packageInfo.applicationInfo.flags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
                           Intent intent = packageManager.getLaunchIntentForPackage(packageInfo.packageName);
                           cordova.getActivity().startActivity(intent);
                           callbackContext.success(1+"");
                           return true;

                       }
                   }
                   callbackContext.success(-1+"");
                   return false;
                }


            } else if (action.equals(this.ACTION_CHECK_ISINSTALL)) {
                JSONObject responseJSON = new JSONObject(args.get(0)+"");
                if (checkPackInfo(responseJSON.get("packageName") + "")) {
                    callbackContext.success(1+"");
                    return true;
                } else  if (checkPackInfoByAppName(responseJSON.get("appName") + "")){
                    callbackContext.success(1+"");
                    return false;
                }else{
                    callbackContext.success(-1+"");
                    return false;
                }


            }else if (action.equals(ACTION_CHECK_APPS_ISINSTALL)) {
                JSONObject responseJson = new JSONObject(args.get(0)+"");
                JSONObject resultJson = new JSONObject();
                Iterator<String> keysIt = responseJson.keys();
                while(keysIt.hasNext()){
                    String key = keysIt.next();
                    JSONObject packAndAppName = new JSONObject(responseJson.get(key)+"");
                    if (checkPackInfo(packAndAppName.get("packageName")+"")) {
                        resultJson.put(key,1+"");

                    } else  if (checkPackInfoByAppName(packAndAppName.get("appName")+"")) {
                        resultJson.put(key,1+"");

                    }else{
                        resultJson.put(key,-1+"");
                    }
                }
                callbackContext.success(resultJson);


            }
        } catch (Exception e) {
            e.printStackTrace();
            callbackContext.error(e.getMessage());
            return false;
        }
        return false;
    }

    private boolean checkPackInfoByAppName(String appName){
        List<PackageInfo> localPackages = cordova.getActivity().getPackageManager().getInstalledPackages(0);
        for(PackageInfo packageInfo : localPackages){
            String installedAppName = packageInfo.applicationInfo.loadLabel(cordova.getActivity().getPackageManager()).toString();
            if(installedAppName.equals(appName)&&(packageInfo.applicationInfo.flags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {

               return true;

            }
        }
        return false;
    }
    private boolean checkPackInfo(String packname) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = packageManager.getPackageInfo(packname, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return packageInfo != null;
    }

}
