package com.indigitall.cordova.inbox;

import android.content.Context;
import android.util.Log;

import com.indigitall.android.commons.models.CorePushAction;
import com.indigitall.android.commons.models.CorePushButton;
import com.indigitall.android.commons.models.ErrorModel;
import com.indigitall.android.inbox.Inbox;
import com.indigitall.android.inbox.callbacks.InboxBaseCallback;
import com.indigitall.android.inbox.callbacks.InboxCallback;
import com.indigitall.android.inbox.callbacks.InboxCountersCallback;
import com.indigitall.android.inbox.callbacks.InboxNextPageCallback;
import com.indigitall.android.inbox.callbacks.InboxNotificationsCallback;
import com.indigitall.android.inbox.models.InboxCategory;
import com.indigitall.android.inbox.models.InboxCounters;
import com.indigitall.android.inbox.models.InboxNotification;
import com.indigitall.android.inbox.models.InboxPush;
import com.indigitall.android.inbox.models.InboxPushAction;
import com.indigitall.android.inbox.models.InboxPushButton;
import com.indigitall.android.inbox.models.InboxStatus;
import com.indigitall.android.push.models.PushAction;
import com.indigitall.android.push.models.PushButton;
import com.indigitall.cordova.utils.InboxParseUtils;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class CordovaIndigitallInbox extends CordovaPlugin {
private static final String TAG = "CordovaIndigitall";

private static final String ACTION_GET_INBOX = "getInbox";
private static final String ACTION_GET_MESSAGE_COUNT = "getMessageCount";
private static final String ACTION_GET_NEXT_PAGE = "getNextPage";
private static final String ACTION_MASSIVE_EDIT = "massiveEditNotificationsWithSendingIdsList";
private static final String ACTION_MASSIVE_EDIT_INITIAL_STATE = "massiveEditNotificationsWithInitialState";
private static final String ACTION_GET_INFO_NOTIFICATION= "getInfoFromNotificationWithSendingId";
private static final String ACTION_MODIFY_STATUS = "modifyStatusFromNotificationWithSendingId";

private static Inbox myInbox;

@Override
public boolean execute(String action, JSONArray params, CallbackContext callback) throws JSONException {
    Log.d(TAG, "Action: " + action);
    //Context context = cordova.getActivity().getApplicationContext();
    Context context = cordova.getContext();
    if (ACTION_GET_INBOX.equals(action)) {
        return getInbox(context,callback);
    } else if(ACTION_GET_MESSAGE_COUNT.equals(action)){
        return getMessagesCount(context,callback);
    } else if(ACTION_GET_NEXT_PAGE.equals(action)){
        return getNextPage(context,callback);
    } else if(ACTION_MASSIVE_EDIT.equals(action)){
        return massiveEdit(context,params,callback);
    } else if(ACTION_MASSIVE_EDIT_INITIAL_STATE.equals(action)) {
        return massiveEditWithInitialState(context, params, callback);
    }else if(ACTION_GET_INFO_NOTIFICATION.equals(action)){
        return getInfoFromNotification(context,params,callback);
    } else if(ACTION_MODIFY_STATUS.equals(action)){
        return modifyStatus(context,params,callback);
    }

    return false;
}

private boolean getInbox(Context context, final CallbackContext callback){
    Inbox.getInbox(context, new InboxCallback(context) {
        @Override
        public void onSuccess(Inbox inbox)
        {
            myInbox = inbox;
            callback.success(InboxParseUtils.jsonFromInbox(inbox, null));
        }
        @Override
        public void onFail(ErrorModel errorModel) { callback.error(errorModel.getErrorMessage().getErrorMessage());  }
    });
    return true;
}

private boolean getMessagesCount(Context context, final CallbackContext callback){
    Inbox.getMessagesCount(context, new InboxCountersCallback(context) {
        @Override
        public void onSuccess(InboxCounters inboxCounters) {
            callback.success(InboxParseUtils.jsonFromMessagesCount(inboxCounters));
        }

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

    private boolean getNextPage(Context context, final CallbackContext callback) {
        myInbox.getNextPage(context, new InboxNextPageCallback(context) {
            @Override
            public void onError(Integer integer, String s, String s1) {
                callback.error(s);
            }

            @Override
            public void onSuccess(Inbox inbox, ArrayList<InboxNotification> arrayList) {
                callback.success(InboxParseUtils.jsonFromInbox(inbox, arrayList));
            }


        });
        return true;
    }

    private boolean massiveEdit(Context context, JSONArray params, final CallbackContext callback) {
        return massiveEditWithInitialState(context, params, callback);
    }
    private boolean massiveEditWithInitialState(Context context, JSONArray params, final CallbackContext callback) {
        final String JSON_SENDING_ID_LIST = "sendingIdList";
        final String JSON_INITIAL_STATUS = "initialStatus";
        final String JSON_STATUS = "status";

        String status = null;
        String initialStatus = null;
        JSONArray jsonArraySendingIdList = null;
        ArrayList<Integer> sendingIdList = new ArrayList<Integer>();
        try {
            if (params.length() > 0 && params.get(0) instanceof JSONObject) {
                JSONObject obj = params.getJSONObject(0);
                if (obj.has(JSON_SENDING_ID_LIST)) jsonArraySendingIdList = obj.getJSONArray(JSON_SENDING_ID_LIST);
                if (obj.has(JSON_STATUS)) status = obj.getString(JSON_STATUS);
                if (obj.has(JSON_INITIAL_STATUS)) initialStatus = obj.getString(JSON_INITIAL_STATUS);
            }

            JSONArray jArray = (JSONArray)jsonArraySendingIdList;
            if (jArray != null) {
                for (int i=0;i<jArray.length();i++){
                    sendingIdList.add(jArray.getInt(i));
                }
            }
        } catch(JSONException ex) {
            ex.printStackTrace();
        }

        if (status != null) {
            myInbox.massiveEditNotificationsWithInitialStatus(context, sendingIdList, getStatus(initialStatus) ,getStatus(status), new InboxBaseCallback(context) {
                @Override
                public void onError(Integer integer, String s, String s1) {
                    callback.error(s);
                }

                @Override
                public void onSuccess() {
                    callback.success();
                }

            });
        }else{callback.error("No status params");}

        return true;
    }

    private InboxStatus getStatus(String status) {
        InboxStatus inboxStatus = InboxStatus.SENT;
        if (status != null) {
            if (status.toLowerCase().equals("click")) {
                inboxStatus = InboxStatus.CLICK;
            } else if (status.toLowerCase().equals("delete") || status.toLowerCase().equals("deleted")) {
                inboxStatus = InboxStatus.DELETED;
            }
        }
        return inboxStatus;
    }
    private boolean getInfoFromNotification(Context context, JSONArray params, final CallbackContext callback){
        final String JSON_SENDING_ID = "sendingId";

        int sendingId = 0;

        try {
            if (params.length() > 0 && params.get(0) instanceof JSONObject) {
                JSONObject obj = params.getJSONObject(0);
                if (obj.has(JSON_SENDING_ID)) sendingId = obj.getInt(JSON_SENDING_ID);
            }

        } catch(JSONException ex) {
            ex.printStackTrace();
        }

        myInbox.getInfoFromNotification(context, sendingId, new InboxNotificationsCallback(context) {
            @Override
            public void onSuccess(InboxNotification inboxNotification) {
               if (inboxNotification != null){
                   callback.success(InboxParseUtils.jsonFromInboxNotification(inboxNotification));
               }else{
                   callback.error("getInfoFromNotification: inboxNotification is null");
               }
            }

            @Override
            public void onFail(ErrorModel error) { callback.error(error.getErrorMessage().getErrorMessage());}
        });
        return true;
    }
    private boolean modifyStatus(Context context, JSONArray params, final CallbackContext callback){
        final String JSON_SENDING_ID = "sendingId";
        final String JSON_STATUS = "status";

        String status = null;
        int sendingId = 0;
        try {
            if (params.length() > 0 && params.get(0) instanceof JSONObject) {
                JSONObject obj = params.getJSONObject(0);
                if (obj.has(JSON_SENDING_ID)) sendingId = obj.getInt(JSON_SENDING_ID);
                if (obj.has(JSON_STATUS)) status = obj.getString(JSON_STATUS);
            }

        } catch(JSONException ex) {
            ex.printStackTrace();
        }
        InboxStatus inboxStatus = null;
        if (status != null) {
            if (status.toLowerCase().equals("click")) {
                inboxStatus = InboxStatus.CLICK;
            } else if (status.toLowerCase().equals("delete") || status.toLowerCase().equals("deleted")) {
                inboxStatus = InboxStatus.DELETED;
            } else {
                inboxStatus = InboxStatus.SENT;
            }
            myInbox.modifyStatusFromNotification(context, sendingId, inboxStatus, new InboxNotificationsCallback(context) {
                @Override
                public void onSuccess(InboxNotification inboxNotification) {
                    if (inboxNotification != null){
                        callback.success(InboxParseUtils.jsonFromInboxNotification(inboxNotification));
                    }else{
                        callback.error("getInfoFromNotification: inboxNotification is null");
                    }
                }


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

        return true;
    }

}
