package cn.com.ths.webview.page;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.PermissionHelper;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import cn.com.ths.thswebview.ThsWebViewActivity;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import cn.com.ths.webview.page.AESUtils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;

/**
 * This class echoes a string called from JavaScript.
 */
public class thswebviewpage extends CordovaPlugin {
    private String ivStr = "solutionsolution"; //加密解密偏移量
  /**
   * 权限列表
   */
  private String[] locPerArr = new String[] {
    Manifest.permission.READ_PHONE_STATE,
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.READ_EXTERNAL_STORAGE
  };

  /**
   * 初始化插件
   *
   * @param cordova
   * @param webView
   */
  @Override
  public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    super.initialize(cordova, webView);
    promtForLocation();
    IntentFilter intentFilter = new IntentFilter(ThsWebViewActivity.JS_EVENT_ACTION_NAME);
    IntentFilter toMainAppMsgActionIntentFilter = new IntentFilter(ThsWebViewActivity.toMainAppMsgAction);
    JSEventBd jsEventBd =  new JSEventBd();
    cordova.getActivity().registerReceiver(jsEventBd,intentFilter);
    // 注册接收消息到主应用
    cordova.getActivity().registerReceiver(jsEventBd,toMainAppMsgActionIntentFilter);
  }

  /**
   * 申请权限
   */
  private void promtForLocation() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
      for (int i = 0, len = locPerArr.length; i < len; i++) {
        if (!PermissionHelper.hasPermission(this, locPerArr[i])) {
          PermissionHelper.requestPermission(this, i, locPerArr[i]);
          return;
        }
      }
    }

  }

  @Override
  public void onRequestPermissionResult(int requestCode,
                                        String[] permissions, int[] grantResults) throws JSONException {
    // TODO Auto-generated method stub
    for (int r : grantResults) {
      if (r == PackageManager.PERMISSION_DENIED) {
        return;
      }
    }
    promtForLocation();
  }

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

        if (action.equals("startWebViewPage")) {
            String url = args.getString(0);
            String title = args.getString(1);
            boolean isLandscapeScreen = args.length() >2?args.getBoolean(2):false;
            String closePageAlertTitle = args.length() >3?args.getString(3):"";
            String closePageAlertMsg = args.length() >4?args.getString(4):"";
            boolean isShowPageAlert = args.length() >5?args.getBoolean(5):false;
            int landscapeScreenFlag = args.length() >6?args.getInt(6):-1;
            this.startWebViewPage(url,title, isLandscapeScreen,closePageAlertTitle, closePageAlertMsg,isShowPageAlert,landscapeScreenFlag,callbackContext);
          return true;
        }else if(action.equals("encryptStr")){
          // 待加密的字符串
          String encryptStr = args.getString(0);
          String keyStr = args.getString(1);
          String content = null;
          try {
            content = AESUtils.aesEncrypt(encryptStr,keyStr, ivStr);
          } catch (Exception e) {
            e.printStackTrace();
          }
          callbackContext.success(content);
          return true;
        }else if(action.equals("sendMessageToH5Page")) {  // 发送消息到子应用
          String data = args.getString(0);
          Intent intent = new Intent(ThsWebViewActivity.revMainAppMsgAction);
          intent.putExtra("data",data);
          cordova.getActivity().sendBroadcast(intent); //广播发送消息到子应用
          callbackContext.success("success");
          return true;

        }
        return false;
    }
    /**
     * 启动WebView页面
     * @param url 地址
     * @param title 标题
     * @param isLandscapeScreen  是否横屏展示 
     */
    private void startWebViewPage(String url,String title,boolean isLandscapeScreen,String closePageAlertTitle, String closePageAlertMsg,boolean isShowPageAlert,int landscapeScreenFlag,CallbackContext callbackContext) {
        if (url != null && url.length() > 0) {
            Intent  intent = new Intent(cordova.getActivity(), ThsWebViewActivity.class);
            intent.putExtra(ThsWebViewActivity.EXTRA_STR,url);
            // cordova.getActivity().finish();
            intent.putExtra(ThsWebViewActivity.EXTRA_TITLE,title);
            intent.putExtra(ThsWebViewActivity.EXTRA_IS_SCREEN_ORIENTATION_LANDSCAPE,isLandscapeScreen);
            intent.putExtra(ThsWebViewActivity.EXTRA_CLOSE_PAGE_ALERT_TITLE,closePageAlertTitle);
            intent.putExtra(ThsWebViewActivity.EXTRA_CLOSE_PAGE_ALERT_MSG,closePageAlertMsg);
            intent.putExtra(ThsWebViewActivity.EXTRA_IS_SHOW_PAGE_ALERT,isShowPageAlert);
            intent.putExtra(ThsWebViewActivity.EXTRA_SCREEN_ORIENTATION,landscapeScreenFlag);

            cordova.getActivity().startActivity(intent);
            callbackContext.success("success");
        } else {
            callbackContext.error("Expected one non-empty string argument.");
        }
    }

    class  JSEventBd extends BroadcastReceiver {
        public   JSEventBd(){

        }

        @Override
        public void onReceive(Context context, Intent intent) {
            // Log.e(intent.getAction(),intent.getStringExtra("event")+":"+intent.getStringExtra("data"));
            if(intent.getAction().equals(ThsWebViewActivity.JS_EVENT_ACTION_NAME)){  // 接收消息到js
                sendMsg(intent.getStringExtra("data"), intent.getStringExtra("event"));
            }else if(intent.getAction().equals(ThsWebViewActivity.toMainAppMsgAction)){ // 接收消息到主应用
                sendMsg(intent.getStringExtra("data"), "toMainAppMsg");
            }
            
        }

        /**
         * 发送消息到
         * @param data
         * @param methodStr  closePage  updateData updateDataAndClose
         */
        private  void sendMsg(String data,String methodStr){
            String format = "cordova.plugin.thswebviewpage."+methodStr+"InAndroidCallback(%s);";
            final String js = String.format(format, "'"+data+"'");
            cordova.getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    thswebviewpage.this.webView.loadUrl("javascript:" + js);
                }
            });
        }
    }
}
