package com.indigitall.cordova.inapp;

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

import android.Manifest;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.content.Intent;

import com.indigitall.android.commons.callbacks.BaseCallback;
import com.indigitall.android.commons.models.CorePushAction;
import com.indigitall.android.commons.models.ErrorModel;
import com.indigitall.android.commons.utils.CorePreferenceUtils;
import com.indigitall.android.inapp.InAppConfiguration;
import com.indigitall.android.inapp.InAppConstants;
import com.indigitall.android.inapp.InAppIndigitall;
import com.indigitall.android.inapp.Utils.EventUtils;
import com.indigitall.android.inapp.Utils.InAppFilterUtils;
import com.indigitall.android.inapp.Utils.InAppFormUtils;
import com.indigitall.android.inapp.Utils.InAppPreferenceUtils;
import com.indigitall.android.inapp.Utils.ServiceUtils;
import com.indigitall.android.inapp.Utils.ShowInAppUtils;
import com.indigitall.android.inapp.api.InAppClient;
import com.indigitall.android.inapp.api.request.InAppTopicRequest;
import com.indigitall.android.inapp.callbacks.GetInAppCallback;
import com.indigitall.android.inapp.callbacks.InAppCallback;
import com.indigitall.android.inapp.callbacks.InAppTopicCallback;
import com.indigitall.android.inapp.callbacks.InAppTopicListFromConsoleCallback;
import com.indigitall.android.inapp.dao.InAppDatabase;
import com.indigitall.android.inapp.models.InAppAction;

import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;
import android.content.pm.PackageManager;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebView;
import android.widget.ImageButton;
import android.widget.PopupWindow;

import androidx.annotation.NonNull;

import com.indigitall.android.inapp.Utils.InAppUtils;
import com.indigitall.android.inapp.Utils.PopUpUtils;
import com.indigitall.android.inapp.models.InApp;
import com.indigitall.android.inapp.models.InAppErrorCode;
import com.indigitall.android.inapp.models.InAppErrorModel;
import com.indigitall.android.inapp.models.InAppFilters;
import com.indigitall.android.inapp.models.InAppForm;
import com.indigitall.android.inapp.models.InAppPageTopic;
import com.indigitall.android.inapp.models.InAppProperties;
import com.indigitall.android.inapp.models.InAppSchema;
import com.indigitall.android.inapp.models.InAppShow;
import com.indigitall.cordova.inapp.callbacks.ShowCDVInAppCallback;
import com.indigitall.cordova.utils.CordovaPreferenceUtils;
import com.indigitall.cordova.utils.InAppParseUtils;

import java.util.ArrayList;

public class CordovaIndigitallInApp extends CordovaPlugin{
    private static final String TAG = "CordovaIndigitallInApp";
    private static final String ACTION_TOPICS_LIST = "topicsList";

    private static final String ACTION_TOPICS_LIST_FROM_CONSOLE = "topicsListFromConsole";
    private static final String ACTION_TOPICS_SUBSCRIBE = "topicsSubscribe";
    private static final String ACTION_TOPICS_UNSUBSCRIBE = "topicsUnsubscribe";
    private static final String ACTION_TOPICS_UNSUBSCRIBE_ALL = "topicsUnsubscribeAll";
    private static final String ACTION_GET_PACKAGE_NAME = "packageName";
    private static final int REQUEST_CODE_ASK_PERMISSIONS = 50001;
    private static final String ACTION_INAPP_IS_WAS_SHOWN = "inAppWasShown";
    private static final String ACTION_INAPP_ADD_NEW_CLICK = "inAppAddNewClick";
    private static final String ACTION_ADD_NEW_INAPP_TO_DISMISS_FOREVER = "addNewInAppToDismissForever";
    private static final String ACTION_EVENT_CLICK_INAPP_REQUEST = "eventClickInAppRequest";
    private static final String ACTION_EVENT_PRINT_INAPP_REQUEST = "eventPrintInAppRequest";
    private static final String  ACTION_FORM_SUBMIT = "inAppFormSubmit";
    private static final String ACTION_SHOWPOPUP = "showPopUp";
    private static final String ACTION_UPDATE_INAPP_EXPIRED = "updateInAppGetWithInAppDb";

    @Override
    public boolean execute(String action, JSONArray params, CallbackContext callback) throws JSONException {
        Log.d(TAG, "Action: " + action);
        Context context = cordova.getActivity().getApplicationContext();
        if (ACTION_TOPICS_LIST.equals(action)) {
            return topicsList(context, callback);
        } else if (ACTION_TOPICS_LIST_FROM_CONSOLE.equals(action)) {
            return topicsListFromConsole(context, params, callback);
        } else if (ACTION_TOPICS_SUBSCRIBE.equals(action)) {
            return topicsSubscribe(context, params, callback);
        } else if (ACTION_GET_PACKAGE_NAME.equals(action)) {
            return getPackageName(context, callback);
        } else if (ACTION_TOPICS_UNSUBSCRIBE.equals(action)) {
            return topicsUnsubscribe(context, params, callback);
        } else if (ACTION_TOPICS_UNSUBSCRIBE_ALL.equals(action)) {
            return topicsUnsubscribeAll(context,  callback);
        } else if(ACTION_INAPP_IS_WAS_SHOWN.equals(action)){
            return inAppIsWasShown(context, params, callback);
        } else if (ACTION_INAPP_ADD_NEW_CLICK.equals(action)){
            return inAppAddNewClick(context, params, callback);
        } else if (ACTION_EVENT_PRINT_INAPP_REQUEST.equals(action)){
            return eventPrintInAppRequest(context, params, callback);
        } else if (ACTION_EVENT_CLICK_INAPP_REQUEST.equals(action)){
            return eventClickInAppRequest(context, params, callback);
        } else if (ACTION_ADD_NEW_INAPP_TO_DISMISS_FOREVER.equals(action)){
            return addNewInAppToDismissForever(context, params, callback);
        } else if (ACTION_FORM_SUBMIT.equals(action)){
            return formSubmit(context, params, callback);
        } else if (ACTION_SHOWPOPUP.equals(action)){
            return showPopUp(context, params, callback);
        } else if (ACTION_UPDATE_INAPP_EXPIRED.equals(action)) {
            return updateInAppGetWithInAppDb(context, params, callback);
        }
        return false;
    }


    private boolean getPackageName(Context context, final CallbackContext callback) {
        if(context.getPackageName() != null){
            callback.success(context.getPackageName());
        }else{
            callback.error(context.getPackageName());
        }
        return true;
    }

    private boolean showPopUp(Context context, JSONArray params, final CallbackContext callback) throws JSONException {
        String JSON_APPKEY = "appKey";
        String JSON_DOMAIN_INAPP = "domainInApp";
        String JSON_SCHEME_ID = "schemeId";
        String JSON_INAPP_IMAGE_CLOSE_BUTTON = "imageCloseButtonName";
        String JSON_CLOSE_ICON_DISBLED = "closeIconDisabled";
        String JSON_INAPP_GET_APP_ACTION = "getOpenAppAction";
        String JSON_INAPP_CLOSE_WHEN_CLICKED = "closePopupWhenClicked";
        String JSON_INAPP_INTENT_ACTION_DISABLED = "setIntentActionDisabled";
        String JSON_LOCATION_PERMISSION = "locationPermission";
        String JSON_TIME_SLIDE_FOR_CAROUSEL = "customTimeSlideForCarousel";
        String JSON_PROFILE = "profile";


        String appKey = "";
        String domainInApp = "https://device-api.indigitall.com/v2";
        String inAppCode ="";
        boolean closeIconDisabled = false;
        boolean closeWhenClicked = false;
        String imageCloseButtonName;
        boolean locationPermission = false;
        boolean intentDisabled = false;
        String profile = null;
        int customTimeSlideForCarousel = InAppConstants.INAPP_TIME_SLIDE_CAROUSEL;

        ImageButton imageCloseButton = null;
        if (params.length() > 0 && params.get(0) instanceof JSONObject) {
            JSONObject obj = params.getJSONObject(0);
            if (obj.has(JSON_APPKEY)) appKey = obj.getString(JSON_APPKEY);
            if (obj.has(JSON_DOMAIN_INAPP)) domainInApp = obj.getString(JSON_DOMAIN_INAPP);
            if (obj.has(JSON_SCHEME_ID)) inAppCode = obj.getString(JSON_SCHEME_ID);
            if (obj.has(JSON_CLOSE_ICON_DISBLED)) closeIconDisabled = obj.getBoolean(JSON_CLOSE_ICON_DISBLED);
            if (obj.has(JSON_LOCATION_PERMISSION)) locationPermission = obj.getBoolean(JSON_LOCATION_PERMISSION);
            if (obj.has(JSON_INAPP_INTENT_ACTION_DISABLED)) intentDisabled = obj.getBoolean(JSON_INAPP_INTENT_ACTION_DISABLED);
            if (obj.has(JSON_INAPP_CLOSE_WHEN_CLICKED)) closeWhenClicked = obj.getBoolean(JSON_INAPP_CLOSE_WHEN_CLICKED);
            if (obj.has(JSON_INAPP_IMAGE_CLOSE_BUTTON)) {
                imageCloseButtonName = obj.getString(JSON_INAPP_IMAGE_CLOSE_BUTTON);
                imageCloseButton = new ImageButton(context);
                imageCloseButton.setBackgroundColor(Color.TRANSPARENT);
                imageCloseButton.setImageResource(context.getResources().getIdentifier(imageCloseButtonName, "drawable", context.getPackageName()));
            }
            if (obj.has(JSON_INAPP_GET_APP_ACTION)) CordovaPreferenceUtils.setInAppAction(context, obj.getBoolean(JSON_INAPP_GET_APP_ACTION));
            if (obj.has(JSON_PROFILE)) profile = obj.getString(JSON_PROFILE);
            if (obj.has(JSON_TIME_SLIDE_FOR_CAROUSEL)) customTimeSlideForCarousel = obj.getInt(JSON_TIME_SLIDE_FOR_CAROUSEL);
        }
        if (inAppCode.length() > 0) {
            String finalInAppCode = inAppCode;
            String finalAppKey = appKey;
            String finalDomainInApp = domainInApp;
            String finalProfile = profile;
            int finalCustomTimeSlideForCarousel = Math.max(customTimeSlideForCarousel, InAppConstants.INAPP_TIME_SLIDE_CAROUSEL);
            View view = cordova.getActivity().findViewById(android.R.id.content).getRootView();
            ImageButton finalImageCloseButton = imageCloseButton;
            boolean finalLocationPermission = locationPermission;
            boolean finalIntentDisabled = intentDisabled;

            boolean finalCloseIconDisabled = closeIconDisabled;
            boolean finalCloseWhenClicked = closeWhenClicked;
            cordova.getThreadPool().execute(new Runnable() {
                @Override
                public void run() {
                    InAppConfiguration.Builder inAppConfiguration = new InAppConfiguration.Builder(finalAppKey);
                    inAppConfiguration.setUrlInAppApi(finalDomainInApp);
                    inAppConfiguration.setIntentActionDisabled(finalIntentDisabled);
                    inAppConfiguration.setAutoRequestPermissionLocation(finalLocationPermission);
                    inAppConfiguration.setCustomTimeSlideForCarousel(finalCustomTimeSlideForCarousel);
                    inAppConfiguration.setProfile(finalProfile);

                    CDVInAppIndigitall.showPopUp(inAppConfiguration.build(), context, view, finalInAppCode, finalImageCloseButton, finalCloseIconDisabled, new ShowCDVInAppCallback() {

                        @Override
                        public void onSuccess(InApp inApp) {
                            super.onSuccess(inApp);
                        }

                        @Override
                        public void onLoad(String s, WebView webView) {
                            try {
                                InAppDatabase mDb = new InAppDatabase(context).open();
                                InApp inApp = new InApp(context, new JSONObject());
                                if (mDb.getMInAppDao() != null) {
                                    inApp = mDb.getMInAppDao().searchInApp(finalInAppCode);
                                }
                                PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, InAppParseUtils.jsonFromInApp(inApp));
                                pluginResult.setKeepCallback(true);
                                callback.sendPluginResult(pluginResult);
                            } catch (JSONException e) {
                                e.printStackTrace();
                                PluginResult pluginResult = new PluginResult(PluginResult.Status.OK);
                                pluginResult.setKeepCallback(true);
                                callback.sendPluginResult(pluginResult);
                            }
                        }

                        @Override
                        public void onFail(String s, WebView webView, String s1) {
                            callback.error(InAppParseUtils.jsonFromInAppErrors(null, 0, s, s1));
                        }

                        @Override
                        public void onShowTimeFinished(String s, WebView webView, int i) {
                            callback.error(InAppParseUtils.jsonFromInAppErrors(null, i, "onShowTimeFinished:"+s, null));
                        }

                        @Override
                        public void didShowManyTimes(InApp inApp, InAppErrorModel inAppErrorModel) {
                            super.didShowManyTimes(inApp, inAppErrorModel);
                            callback.error(InAppParseUtils.jsonFromInAppShowError(inApp, inAppErrorModel));
                        }

                        @Override
                        public void didClicked(PopupWindow popup, InApp inApp, InAppAction action) {
                            try {
                                PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, InAppParseUtils.getInAppActionCallback(inApp,action));
                                pluginResult.setKeepCallback(true);
                                callback.sendPluginResult(pluginResult);

                            } catch (Exception e) {
                                e.printStackTrace();
                                PluginResult pluginResult = new PluginResult(PluginResult.Status.OK);
                                pluginResult.setKeepCallback(true);
                                callback.sendPluginResult(pluginResult);
                                callback.success();
                            }

                            if (finalCloseWhenClicked) {
                                cordova.getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        popup.dismiss();
                                    }
                                });
                            }
                        }


                        @Override
                        public void didClickOut(InApp inApp, InAppErrorModel inAppErrorModel) {
                            super.didClickOut(inApp, inAppErrorModel);
                            callback.error(InAppParseUtils.jsonFromInAppShowError(inApp, inAppErrorModel));
                        }

                        @Override
                        public void didClosed() {
                            super.didClosed();
                            callback.error("InApp didClosed");
                        }

                        @Override
                        public void didDismissed() {
                            super.didDismissed();
                            callback.error("InApp dismiss");
                        }

                        @Override
                        public void didDismissForever(InApp inApp, InAppErrorModel inAppErrorModel) {
                            super.didDismissForever(inApp, inAppErrorModel);
                            callback.error(InAppParseUtils.jsonFromInAppShowError(inApp, inAppErrorModel));
                        }

                        @Override
                        public void didExpired(InApp inApp, InAppErrorModel inAppErrorModel) {
                            super.didExpired(inApp, inAppErrorModel);
                            callback.error(InAppParseUtils.jsonFromInAppShowError(inApp, inAppErrorModel));
                        }

                        @Override
                        public void didFormError(InApp inApp, ArrayList<InAppErrorModel> arrayList) {
                            super.didFormError(inApp, arrayList);
                            int errorId = 0;
                            if (arrayList.get(0) != null && arrayList.get(0).getErrorCode().getErrorId() != null) {
                                errorId = arrayList.get(0).getErrorCode().getErrorId();
                            }
                            callback.error(InAppParseUtils.jsonFromInAppErrors(inApp, errorId, "didFormError: " + arrayList.get(0).getErrorMessage().getErrorMessage(), arrayList.get(0).getDescriptionMessage()));
                        }

                        @Override
                        public void didFormSubmit(InApp inApp, JSONObject jsonObject) {
                            super.didFormSubmit(inApp);
                            PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, InAppParseUtils.getInAppFormSubmitCallback(inApp, jsonObject));
                            pluginResult.setKeepCallback(true);
                            callback.sendPluginResult(pluginResult);
                        }


                    });
                }
            });
        }
        return  true;
    }
    private boolean topicsList(Context context, final CallbackContext callback) {
        InAppIndigitall.topicsList(context, new BaseCallback() {
            @Override
            public void onSuccess(JSONObject jsonObject) {
                callback.success(jsonObject);
            }

            @Override
            public void onFail(ErrorModel errorModel) {
                callback.error(errorModel.getErrorMessage().getErrorMessage());
            }

            @Override
            public void onError(int i, String s, String s1) {
                super.onError(i, s, s1);
            }
        });

        return true;
    }

    private boolean topicsListFromConsole(Context context, JSONArray params, final CallbackContext callback) {
        String JSON_APPKEY = "appKey";
        String JSON_DOMAIN_INAPP = "domainInApp";
        String JSON_LIMIT = "limit";
        String JSON_PAGE = "page";

        String appKey = null;
        String domainInApp = "https://device-api.indigitall.com/v2";
        int limit = 20;
        int page = 0;

        try {
            if (params.length() > 0 && params.get(0) instanceof JSONObject) {
                JSONObject obj = params.getJSONObject(0);
                if (obj.has(JSON_APPKEY)) appKey = obj.getString(JSON_APPKEY);
                if (obj.has(JSON_DOMAIN_INAPP)) domainInApp = obj.getString(JSON_DOMAIN_INAPP);
                if (obj.has(JSON_LIMIT)) limit = obj.getInt(JSON_LIMIT);
                if (obj.has(JSON_PAGE)) page = obj.getInt(JSON_PAGE);
            }
        } catch (JSONException ex) {
            ex.printStackTrace();
        }
        String finalAppKey = appKey;
        String finalDomainInApp = domainInApp;
        int finalLimit = limit;
        int finalPage = page;
        cordova.getThreadPool().execute(new Runnable() {
            @Override
            public void run() {
                if (finalAppKey != null) {
                    CorePreferenceUtils.setAppKey(context, finalAppKey);
                    InAppPreferenceUtils.setInAppApiURL(context, finalDomainInApp);
                }
                int newLimit = Math.max(finalLimit, 20);
                InAppPreferenceUtils.setInAppTopicsListLimit(context, newLimit);
                InAppTopicRequest request = new InAppTopicRequest(context);
                request.setPage(finalPage);
                InAppClient.getTopics(request, new InAppTopicListFromConsoleCallback(context, finalPage) {
                    @Override
                    public void onSuccess(@NonNull InAppPageTopic inAppPageTopic) {
                        callback.success(InAppParseUtils.jsonFromInAppPageTopic(inAppPageTopic));
                    }

                    @Override
                    public void onError(@NonNull InAppErrorModel inAppErrorModel) {
                        callback.error(inAppErrorModel.getErrorMessage().getErrorMessage());
                    }
                });
            }
        });

        return true;
    }

    private boolean topicsSubscribe(Context context, JSONArray params, final CallbackContext callback) {
        String[] topics = InAppParseUtils.parseTopicArray(params);

        InAppIndigitall.topicsSubscribe(context, topics, new InAppTopicCallback() {
            @Override
            public void onSuccess(String s) {
                callback.success(s);
            }

            @Override
            public void onError(InAppErrorModel inAppErrorModel) {
                callback.error(inAppErrorModel.getErrorMessage().getErrorMessage());
            }
        });

        return true;
    }

    private boolean topicsUnsubscribe(Context context, JSONArray params, final CallbackContext callback) {
        String[] topics = InAppParseUtils.parseTopicArray(params);

        InAppIndigitall.topicsUnsubscribe(context, topics, new InAppTopicCallback() {
            @Override
            public void onSuccess(String s) {
                callback.success(s);
            }

            @Override
            public void onError(InAppErrorModel inAppErrorModel) {
                callback.error(inAppErrorModel.getErrorMessage().getErrorMessage());
            }
        });
        return true;
    }
    
    private boolean topicsUnsubscribeAll(Context context, final CallbackContext callback) {
        InAppIndigitall.topicsUnsubscribeAll(context, new InAppTopicCallback() {
            @Override
            public void onSuccess(String s) {
                callback.success(s);
            }

            @Override
            public void onError(InAppErrorModel inAppErrorModel) {
                callback.error(inAppErrorModel.getErrorMessage().getErrorMessage());
            }
        });
        return true;
    }

    private boolean inAppIsWasShown(Context context, JSONArray params, final CallbackContext callback) throws JSONException {
        String JSON_APPKEY = "appKey";
        String JSON_DOMAIN_INAPP = "domainInApp";
        String JSON_SCHEME_ID = "schemeId";
        String JSON_TIME_SLIDE_FOR_CAROUSEL = "customTimeSlideForCarousel";
        String JSON_PROFILE = "profile";

        String appKey = "";
        String domainInApp = "https://device-api.indigitall.com/v2";
        String inAppCode ="";
        String profile = null;
        int customTimeSlideForCarousel = InAppConstants.INAPP_TIME_SLIDE_CAROUSEL;
        if (params.length() > 0 && params.get(0) instanceof JSONObject) {
            JSONObject obj = params.getJSONObject(0);
            if (obj.has(JSON_APPKEY)) appKey = obj.getString(JSON_APPKEY);
            if (obj.has(JSON_DOMAIN_INAPP)) domainInApp = obj.getString(JSON_DOMAIN_INAPP);
            if (obj.has(JSON_SCHEME_ID)) inAppCode = obj.getString(JSON_SCHEME_ID);
            if (obj.has(JSON_PROFILE)) profile = obj.getString(JSON_PROFILE);
            if (obj.has(JSON_TIME_SLIDE_FOR_CAROUSEL)) customTimeSlideForCarousel = obj.getInt(JSON_TIME_SLIDE_FOR_CAROUSEL);
        }

        if (inAppCode.length() > 0) {
            String finalInAppCode = inAppCode;
            String finalAppKey = appKey;
            String finalDomainInApp = domainInApp;
            String finalProfile = profile;
            int finalCustomTimeSlideForCarousel = Math.max(customTimeSlideForCarousel, InAppConstants.INAPP_TIME_SLIDE_CAROUSEL);
            cordova.getThreadPool().execute(new Runnable() {
                @Override
                public void run() {
                    InAppConfiguration.Builder inAppConfiguration = new InAppConfiguration.Builder(finalAppKey);
                    inAppConfiguration.setUrlInAppApi(finalDomainInApp);
                    inAppConfiguration.setCustomTimeSlideForCarousel(finalCustomTimeSlideForCarousel);
                    inAppConfiguration.setProfile(finalProfile);
                    InAppIndigitall.showCustomInApp(context, inAppConfiguration.build(), finalInAppCode, new InAppCallback(context) {
                        @Override
                        public void onSuccess(InApp inApp) {
                            callback.success(InAppParseUtils.jsonFromInApp(inApp));
                        }

                        @Override
                        public void onError(int i, String s, String s1) {
                            callback.error(InAppParseUtils.jsonFromInAppErrors(null, i, s, s1));
                        }
                    });                   
                }
            });
        }
        return  true;
    }

    private boolean inAppAddNewClick(Context context, JSONArray params, final CallbackContext callback) throws JSONException {
        InAppAction action = null;
        if (params != null && params.length() > 0) {
            if (params.get(0) != null) {
                InApp inApp = getInApp(context, params);
                if (inApp != null && params.get(1) != null && params.get(1) instanceof String) {
                    int inAppId = inApp.getInAppId();
                    InAppDatabase mDb = new InAppDatabase(context).open();
                    if (mDb.getMInAppDao() != null && inAppId != 0) inApp = mDb.getMInAppDao().searchInAppWithInAppId(inAppId);
                    action = new InAppAction(new JSONObject(params.getString(1)).getJSONObject("action"));
                    inApp.getProperties().setAction(action);
                }
                if (inApp != null) {
                    InApp finalInApp = inApp;
                    InAppAction finalAction = action;
                    cordova.getThreadPool().execute(new Runnable() {
                        @Override
                        public void run() {
                            if (finalInApp.getProperties() != null && finalInApp.getProperties().getAction() != null) {
                                Intent intent = finalInApp.getProperties().getAction().getIntent(context);
                                boolean isAppAction = finalInApp.getProperties().getAction().getType() == InAppAction.Type.APP;
                                InAppUtils.inAppWasClicked(context, finalInApp, finalAction,intent, isAppAction);
                                callback.success(InAppParseUtils.getInAppActionCallback(finalInApp, finalAction));
                            }else{
                                callback.error("InApp no properties");
                            }
                        }
                    });
                }else{
                    android.util.Log.e("[IND]","inAppAddNewClick: InApp is not a JsonObject either String");
                }
            }
        }
        return true;
    }

    private boolean eventPrintInAppRequest(Context context, JSONArray params, final CallbackContext callback ) {
        InApp inApp = getInApp(context, params);
        if (inApp != null) {
            cordova.getThreadPool().execute(new Runnable() {
                @Override
                public void run() {
                    EventUtils.sendEventPrint(context, inApp);
                    callback.success();
                }
            });
        }else{
            callback.error("InApp is not a JsonObject either String");
        }
        return true;
    }

    private boolean eventClickInAppRequest(Context context, JSONArray params, final CallbackContext callback ) {
        InApp inApp = getInApp(context, params);
        if (inApp != null) {
            cordova.getThreadPool().execute(new Runnable() {
                @Override
                public void run() {
                    EventUtils.sendEventClick(context, inApp);
                    callback.success();
                }
            });
        }else{
            callback.error("InApp is not a JsonObject either String");
        }
        return true;
    }

    private boolean addNewInAppToDismissForever(Context context, JSONArray params, final CallbackContext callback) {
        InApp inApp = getInApp(context, params);
        if (inApp != null) {
            cordova.getThreadPool().execute(new Runnable() {
                @Override
                public void run() {
                    PopUpUtils.addNewInAppToDismissForever(context, inApp);
                    callback.success();
                }
            });
        }else{
            callback.error("InApp is not a JsonObject either String");
        }
        return true;
    }

    private boolean formSubmit(Context context, JSONArray params, final CallbackContext callback) throws JSONException {
        InAppForm inAppForm = null;
        String jsonFormat = null;
        String jsonCustomer = null;
        if (params != null && params.length() > 1) {
            InApp inApp = getInApp(context, params);
            if(params.get(1) != null && params.get(1) instanceof String) {
                inAppForm = new InAppForm(new JSONObject(params.getString(1)));
            }
            if(params.get(2) != null && params.get(2) instanceof String) {
                jsonFormat = params.getString(2);
            }
            if(params.get(3) != null && params.get(3) instanceof String) {
                jsonCustomer = params.getString(3);
            }
            if (inAppForm != null && jsonFormat != null) {
                ArrayList<InAppErrorModel> errorList = InAppFormUtils.checkFieldsForm(inAppForm, new JSONObject(jsonFormat));
                if (errorList.isEmpty()) {
                    EventUtils.sendEventForm(context, inApp, new JSONObject(jsonFormat));
                    callback.success(InAppParseUtils.jsonFromInApp(inApp));
                    if (jsonCustomer != null) {
                        JSONObject json = new JSONObject(jsonCustomer);
                        if (json.length() > 0) {
                            EventUtils.sendEventFormToCustomer(context, json);
                        }
                    }
                } else {
                    callback.error(String.valueOf(errorList));
                }
            }

        }
        return true;
    }

    private InApp getInApp(Context context, JSONArray params) {
        InApp inApp = null;
        try {
            if (params.get(0) != null) {
                if (params.get(0) instanceof String) {
                    inApp = new InApp(params.getString(0));
                } else if (params.get(0) instanceof JSONObject && params.getJSONObject(0).length() > 0) {
                    inApp = new InApp(context, params.getJSONObject(0));
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return inApp;
    }

    private boolean updateInAppGetWithInAppDb(Context context, JSONArray params, CallbackContext callback) {
        InAppDatabase mDb = new InAppDatabase(context).open();
        try {
            if (params.length() > 0 &&  params.getString(0) != null && mDb.getMInAppDao() != null) {
                InApp inAppDb = mDb.getMInAppDao().searchInApp(params.getString(0));
                if (inAppDb != null) {
                    cordova.getThreadPool().execute(new Runnable() {
                        @Override
                        public void run() {
                            InAppIndigitall.inAppGet(context, inAppDb.getSchema().getCode(), new InAppCallback(context) {
                                @Override
                                public void onSuccess(InApp inApp) {
                                    InApp newInApp = ShowInAppUtils.updateInAppValues(inAppDb, inApp);
                                    InAppErrorModel error = InAppFilterUtils.wasInAppPassedFilterProperties(context, newInApp);
                                    if (error != null) {
                                        if (error.getErrorCode() == InAppErrorCode.INAPP_WAS_SHOWN_MANY_TIMES) {
                                            callback.error(InAppParseUtils.jsonFromInAppShowError(newInApp, error));
                                        } else if (error.getErrorCode() == InAppErrorCode.INAPP_WAS_CLICKED_MANY_TIMES) {
                                            callback.error(InAppParseUtils.jsonFromInAppShowError(newInApp, error));
                                        }
                                    } else {
                                        PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, InAppParseUtils.jsonFromInApp(inApp));
                                        pluginResult.setKeepCallback(true);
                                        callback.sendPluginResult(pluginResult);
                                    }
                                }

                                @Override
                                public void onFail(ErrorModel errorModel) {
                                    super.onFail(errorModel);
                                    callback.error(errorModel.getErrorMessage().getErrorMessage());
                                }
                            });
                        }
                    });
                }
            }
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }
        return true;
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException {
        if (requestCode == REQUEST_CODE_ASK_PERMISSIONS && grantResults.length > 0) {
            for (int i = 0; i < permissions.length; i++) {
                if (Manifest.permission.ACCESS_FINE_LOCATION.equals(permissions[i])
                        && grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    // if (PreferenceUtils.getLocationEnabled(cordova.getActivity().getApplicationContext())) {
                    ServiceUtils.registerLocationService(cordova.getActivity().getApplicationContext());
                    // }
                }
            }
        }
    }


}
