package com.indigitall.cordova.liveActivity;

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.indigitall.android.Indigitall;
import com.indigitall.android.commons.models.ErrorModel;
import com.indigitall.android.liveactivity.IndigitallLA;
import com.indigitall.android.liveactivity.callbacks.LACallback;
import com.indigitall.android.liveactivity.callbacks.LADeviceCallback;
import com.indigitall.android.liveactivity.callbacks.LATopicCallback;
import com.indigitall.android.liveactivity.models.LADevice;
import com.indigitall.android.liveactivity.models.LiveActivity;
import com.indigitall.android.push.callbacks.DeviceCallback;
import com.indigitall.android.push.models.Device;
import com.indigitall.cordova.utils.LAParseUtils;
import com.indigitall.cordova.utils.PushParseUtils;

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

import java.util.ArrayList;

public class CordovaIndigitallLA extends CordovaPlugin {

    private static final String TAG = "CordovaIndigitallInApp";

    private static final String ACTION_LOGIN = "logIn";
    private static final String ACTION_LOGOUT = "logOut";
    private static final String ACTION_TOPICS_LIST = "topicsList";
    private static final String ACTION_TOPICS_SUBSCRIBE = "topicsSubscribe";
    private static final String ACTION_TOPICS_UNSUBSCRIBE = "topicsUnsubscribe";
    private static final String ACTIOJN_LIVE_ACTIVITIES = "getListLiveActivities";

    @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_SUBSCRIBE.equals(action)) {
            return topicsSubscribe(context, params, callback);
        } else if (ACTION_TOPICS_UNSUBSCRIBE.equals(action)) {
            return topicsUnsubscribe(context, params, callback);
        } else if (ACTION_LOGIN.equals(action)) {
            return logIn(context,params, callback);
        } else if (ACTION_LOGOUT.equals(action)) {
            return logOut(context, callback);
        } else if (ACTIOJN_LIVE_ACTIVITIES.equals(action)) {
            return getListLiveActivities(context, callback);
        }
        return  true;
    }

    private boolean logIn(Context context,JSONArray params, final CallbackContext callback) throws JSONException  {
        IndigitallLA.login(context,params.get(0).toString(),new LADeviceCallback(context) {
            @Override
            public void onSuccess(@NonNull LADevice laDevice) {
                callback.success(LAParseUtils.jsonFromDevice(laDevice));
            }

            @Override
            public void onError(@Nullable Integer integer, @Nullable String s, @Nullable String s1) {
                callback.error(s);
            }

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

    private boolean logOut(Context context, final CallbackContext callback) throws JSONException  {
        IndigitallLA.logOut(context,new LADeviceCallback(context) {

            @Override
            public void onSuccess(@NonNull LADevice laDevice) {
                callback.success(LAParseUtils.jsonFromDevice(laDevice));
            }

            @Override
            public void onError(@Nullable Integer integer, @Nullable String s, @Nullable String s1) {
                callback.error(s);
            }

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

    private boolean getListLiveActivities(Context context,
                                           final CallbackContext callback) {
        IndigitallLA.getListLiveActivities(context, new LACallback() {

            @Override
            public void onSuccess(@NonNull ArrayList<LiveActivity> arrayList) {
                callback.success(LAParseUtils.liveActivityListToJson(arrayList));
            }

            @Override
            public void onError(@Nullable Integer integer, @Nullable String s, @Nullable String s1) {
                callback.error(s);
            }

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

    private boolean topicsList(Context context,
                                 final CallbackContext callback) {
        IndigitallLA.topicList(context, new LATopicCallback(context) {
            @Override
            public void onSuccess(@Nullable ArrayList<String> arrayList) {
                if (arrayList != null) {
                    callback.success(LAParseUtils.jsonArrayFromTopicArray(arrayList));
                }
            }

            @Override
            public void onError(@Nullable Integer integer, @Nullable String s, @Nullable String s1) {
                callback.error(s);
            }


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

    private boolean topicsSubscribe(Context context,
                                    JSONArray params,
                                      final CallbackContext callback) {
        ArrayList<String> topics = LAParseUtils.parseTopics(params);
        IndigitallLA.subscribeToTopic(context, topics, new LATopicCallback(context) {
            @Override
            public void onSuccess(@Nullable ArrayList<String> arrayList) {
                if (arrayList != null) {
                    callback.success(LAParseUtils.jsonArrayFromTopicArray(arrayList));
                }
            }

            @Override
            public void onError(@Nullable Integer integer, @Nullable String s, @Nullable String s1) {
                callback.error(s);
            }
        });
        return true;
    }

    private boolean topicsUnsubscribe(Context context,
                                      JSONArray params,
                                         final CallbackContext callback) {
        ArrayList<String> topics = LAParseUtils.parseTopics(params);
        IndigitallLA.unsubscribeToTopic(context, topics, new LATopicCallback(context) {
            @Override
            public void onSuccess(@Nullable ArrayList<String> arrayList) {
                if (arrayList != null) {
                    callback.success(LAParseUtils.jsonArrayFromTopicArray(arrayList));
                }
            }

            @Override
            public void onError(@Nullable Integer integer, @Nullable String s, @Nullable String s1) {
                callback.error(s);
            }
        });
        return true;
    }


}
