package com.chatsdk.dispatch;

import com.chatsdk.common.ExtSdkCallback;
import io.agora.CallBack;
import io.agora.ValueCallBack;
import io.agora.chat.ChatClient;
import io.agora.chat.Conversation;
import io.agora.chat.PushConfigs;
import io.agora.chat.PushManager;
import io.agora.chat.SilentModeParam;
import io.agora.chat.SilentModeResult;
import io.agora.exceptions.ChatException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ExtSdkPushManagerWrapper extends ExtSdkWrapper {

    public static class SingleHolder {
        static ExtSdkPushManagerWrapper instance = new ExtSdkPushManagerWrapper();
    }

    public static ExtSdkPushManagerWrapper getInstance() { return ExtSdkPushManagerWrapper.SingleHolder.instance; }

    public void getImPushConfig(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        PushConfigs configs = ChatClient.getInstance().pushManager().getPushConfigs();
        onSuccess(result, channelName, ExtSdkPushConfigsHelper.toJson(configs));
    }

    public void getImPushConfigFromServer(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        try {
            PushConfigs configs = ChatClient.getInstance().pushManager().getPushConfigsFromServer();
            onSuccess(result, channelName, ExtSdkPushConfigsHelper.toJson(configs));
        } catch (ChatException e) {
            ExtSdkWrapper.onError(result, e, null);
        }
    }

    public void updatePushNickname(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        String nickname = params.getString("nickname");
        try {
            ChatClient.getInstance().pushManager().updatePushNickname(nickname);
            onSuccess(result, channelName, nickname);
        } catch (ChatException e) {
            ExtSdkWrapper.onError(result, e, null);
        }
    }

    public void enableOfflinePush(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        onSuccess(result, channelName, null);
    }

    public void disableOfflinePush(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        onSuccess(result, channelName, null);
    }

    public void getNoPushGroups(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        onSuccess(result, channelName, null);
    }

    public void getNoPushUsers(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        onSuccess(result, channelName, null);
    }

    public void updateImPushStyle(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        PushManager.DisplayStyle style = params.getInt("pushStyle") == 0 ? PushManager.DisplayStyle.SimpleBanner
                                                                           : PushManager.DisplayStyle.MessageSummary;
        ChatClient.getInstance().pushManager().asyncUpdatePushDisplayStyle(style, new CallBack() {
            @Override
            public void onSuccess() {
                ExtSdkWrapper.onSuccess(result, channelName, true);
            }

            @Override
            public void onError(int code, String error) {
                ExtSdkWrapper.onError(result, code, error);
            }
        });
    }

    public void updateGroupPushService(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        onSuccess(result, channelName, null);
    }

    public void updateUserPushService(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        onSuccess(result, channelName, null);
    }

    public void updateHMSPushToken(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        String token = params.getString("token");
        ChatClient.getInstance().sendHMSPushTokenToServer(token);
        onSuccess(result, channelName, token);
    }

    public void updateFCMPushToken(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        String token = params.getString("token");
        ChatClient.getInstance().sendFCMTokenToServer(token);
        onSuccess(result, channelName, token);
    }

    public void reportPushAction(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        // TODO:
    }

    public void setConversationSilentMode(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        String conversationId = params.getString("conversationId");
        Conversation.ConversationType type =
            ExtSdkConversationHelper.typeFromInt(params.getInt("conversationType"));
        SilentModeParam param = ExtSdkSilentModeParamHelper.fromJson(params.getJSONObject("param"));
        ChatClient.getInstance().pushManager().setSilentModeForConversation(
            conversationId, type, param, new ValueCallBack<SilentModeResult>() {
                @Override
                public void onSuccess(SilentModeResult value) {
                    ExtSdkWrapper.onSuccess(result, channelName, null);
                }

                @Override
                public void onError(int error, String errorMsg) {
                    ExtSdkWrapper.onError(result, error, errorMsg);
                }
            });
    }

    public void removeConversationSilentMode(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        String conversationId = params.getString("conversationId");
        Conversation.ConversationType type =
            ExtSdkConversationHelper.typeFromInt(params.getInt("conversationType"));
        ChatClient.getInstance().pushManager().clearRemindTypeForConversation(conversationId, type, new CallBack() {
            @Override
            public void onSuccess() {
                ExtSdkWrapper.onSuccess(result, channelName, null);
            }

            @Override
            public void onError(int code, String error) {
                ExtSdkWrapper.onError(result, code, error);
            }
        });
    }

    public void fetchConversationSilentMode(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        String conversationId = params.getString("conversationId");
        Conversation.ConversationType type =
            ExtSdkConversationHelper.typeFromInt(params.getInt("conversationType"));
        ChatClient.getInstance().pushManager().getSilentModeForConversation(
            conversationId, type, new ValueCallBack<SilentModeResult>() {
                @Override
                public void onSuccess(SilentModeResult value) {
                    ExtSdkWrapper.onSuccess(result, channelName, ExtSdkSilentModeResultHelper.toJson(value));
                }

                @Override
                public void onError(int error, String errorMsg) {
                    ExtSdkWrapper.onError(result, error, errorMsg);
                }
            });
    }

    public void setSilentModeForAll(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        SilentModeParam param = ExtSdkSilentModeParamHelper.fromJson(params.getJSONObject("param"));
        ChatClient.getInstance().pushManager().setSilentModeForAll(param, new ValueCallBack<SilentModeResult>() {
            @Override
            public void onSuccess(SilentModeResult value) {
                ExtSdkWrapper.onSuccess(result, channelName, null);
            }

            @Override
            public void onError(int error, String errorMsg) {
                ExtSdkWrapper.onError(result, error, errorMsg);
            }
        });
    }

    public void fetchSilentModeForAll(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        ChatClient.getInstance().pushManager().getSilentModeForAll(new ValueCallBack<SilentModeResult>() {
            @Override
            public void onSuccess(SilentModeResult value) {
                ExtSdkWrapper.onSuccess(result, channelName, ExtSdkSilentModeResultHelper.toJson(value));
            }

            @Override
            public void onError(int error, String errorMsg) {
                ExtSdkWrapper.onError(result, error, errorMsg);
            }
        });
    }

    public void fetchSilentModeForConversations(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        ArrayList<Conversation> list = new ArrayList<>();
        JSONArray convs = params.getJSONArray("convs");
        for (int i = 0; i < convs.length(); ++i) {
            Conversation conversation = this.getConversation((JSONObject)convs.get(i));
            list.add(conversation);
        }

        ChatClient.getInstance().pushManager().getSilentModeForConversations(
            list, new ValueCallBack<Map<String, SilentModeResult>>() {
                @Override
                public void onSuccess(Map<String, SilentModeResult> value) {
                    Map<String, Map> valueJson = new HashMap<>();
                    for (Map.Entry<String, SilentModeResult> entry : value.entrySet()) {
                        valueJson.put(entry.getKey(), ExtSdkSilentModeResultHelper.toJson(entry.getValue()));
                    }
                    ExtSdkWrapper.onSuccess(result, channelName, valueJson);
                }

                @Override
                public void onError(int error, String errorMsg) {
                    ExtSdkWrapper.onError(result, error, errorMsg);
                }
            });
    }

    public void setPreferredNotificationLanguage(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        String code = params.getString("code");
        ChatClient.getInstance().pushManager().setPreferredNotificationLanguage(code, new CallBack() {
            @Override
            public void onSuccess() {
                ExtSdkWrapper.onSuccess(result, channelName, null);
            }

            @Override
            public void onError(int code, String error) {
                ExtSdkWrapper.onError(result, code, error);
            }
        });
    }

    public void fetchPreferredNotificationLanguage(JSONObject params, String channelName, ExtSdkCallback result)
        throws JSONException {
        ChatClient.getInstance().pushManager().getPreferredNotificationLanguage(new ValueCallBack<String>() {
            @Override
            public void onSuccess(String value) {
                ExtSdkWrapper.onSuccess(result, channelName, value);
            }

            @Override
            public void onError(int error, String errorMsg) {
                ExtSdkWrapper.onError(result, error, errorMsg);
            }
        });
    }

    public void setPushTemplate(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        String templateName = params.getString("templateName");
        ChatClient.getInstance().pushManager().setPushTemplate(templateName, new CallBack() {
            @Override
            public void onSuccess() {
                ExtSdkWrapper.onSuccess(result, channelName, null);
            }

            @Override
            public void onError(int i, String s) {
                ExtSdkWrapper.onError(result, i, s);
            }
        });
    }
    public void getPushTemplate(JSONObject params, String channelName, ExtSdkCallback result) throws JSONException {
        ChatClient.getInstance().pushManager().getPushTemplate(new ValueCallBack<String>() {
            @Override
            public void onSuccess(String s) {
                Map<String, String> ret = new HashMap<>();
                ret.put("templateName", s);
                ExtSdkWrapper.onSuccess(result, channelName, ret);
            }

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