package com.indigitall.cordova.interfaces;

import android.content.Context;
import android.content.Intent;
import android.webkit.JavascriptInterface;
import android.widget.PopupWindow;

import com.indigitall.android.commons.models.CoreAction;
import com.indigitall.android.inapp.Utils.EventUtils;
import com.indigitall.android.inapp.Utils.InAppFormUtils;
import com.indigitall.android.inapp.Utils.InAppUtils;
import com.indigitall.android.inapp.Utils.ShowInAppUtils;
import com.indigitall.android.inapp.callbacks.ShowInAppCallback;
import com.indigitall.android.inapp.models.InApp;
import com.indigitall.android.inapp.models.InAppAction;
import com.indigitall.android.inapp.models.InAppErrorModel;
import com.indigitall.android.inapp.models.InAppForm;
import com.indigitall.cordova.inapp.callbacks.ShowCDVInAppCallback;
import com.indigitall.cordova.utils.CordovaPreferenceUtils;

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

import java.util.ArrayList;
import java.util.List;

public class WebCDVInAppInterface {
    Context context;
    InApp inApp;
    PopupWindow popupWindow;
    ShowCDVInAppCallback show;

    public WebCDVInAppInterface(Context context, InApp inApp, PopupWindow popupWindow, ShowCDVInAppCallback showInAppCallback) {
        this.context = context;
        this.inApp = inApp;
        this.popupWindow = popupWindow;
        this.show = showInAppCallback;
    }

    @JavascriptInterface
    public void onClick(String actionString) {
        if (actionString != null) {
            try {
                InAppAction action = new InAppAction(new JSONObject(actionString).getString(InAppAction.ACTION));
                Intent intentAction = action.getIntent(context);
                boolean isAppAction =  action.getType() == CoreAction.Type.APP;
                if (CordovaPreferenceUtils.getInAppAction(context) && isAppAction) {
                    inApp.getProperties().setAction(action);
                    ShowInAppUtils.addNewInAppClick(context, inApp);
                    EventUtils.sendEventClick(context, inApp);
                    if (show != null) show.didClicked(popupWindow, inApp, action);
                } else {
                    if (InAppUtils.inAppWasClicked(context, inApp, action, intentAction, isAppAction)) {
                        if (show != null) show.didClicked(popupWindow, inApp, action);
                    } else {
                        if (show != null) show.onFail(String.valueOf(inApp.getInAppId()), null, "WebCDVInAppInterface inAppWasClicked error");
                    }
                }

            } catch (JSONException e) {
                throw new RuntimeException(e);
            }
        } else {
            if (show != null) show.onFail(String.valueOf(inApp.getInAppId()), null, "WebCDVInAppInterface no action");
        }
    }

    @JavascriptInterface
    public void submit(String formOptionsString, String jsonFormat, String jsonCustomer) {
        if (formOptionsString != null) {
            try {
                InAppForm inAppForm = new InAppForm(new JSONObject(formOptionsString));

                if (jsonFormat != null) {
                    JSONObject jsonFormatObj = new JSONObject(jsonFormat);

                    ArrayList<InAppErrorModel> errorList = InAppFormUtils.checkFieldsForm(inAppForm, jsonFormatObj);

                    if (errorList.isEmpty()) {
                        EventUtils.sendEventForm(context, inApp, jsonFormatObj);
                        if (show != null) {
                            show.didFormSubmit(inApp, jsonFormatObj);
                        }
                    } else {
                        if (show != null) {
                            show.didFormError(inApp, errorList);
                        }
                        return;
                    }
                }

                if (jsonCustomer != null) {
                    JSONObject jsonCustomerObj = new JSONObject(jsonCustomer);
                    if (jsonCustomerObj.length() > 0) {
                        EventUtils.sendEventFormToCustomer(context, jsonCustomerObj);
                    }
                }
            } catch (JSONException ex) {
                ex.printStackTrace();
            }
        }
    }

    

}
