package com.yidianling.im.bridge;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import androidx.appcompat.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;

import com.google.gson.internal.LinkedTreeMap;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.msg.MessageBuilder;
import com.netease.nimlib.sdk.msg.MsgService;
import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.CustomMessageConfig;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.umeng.analytics.MobclickAgent;
import com.ydl.webview.H5Params;
import com.ydl.webview.NewH5Activity;
import com.ydl.ydlcommon.base.config.HttpConfig;
import com.ydl.ydlcommon.bean.ShareData;
import com.ydl.ydlcommon.data.PlatformDataManager;
import com.ydl.ydlcommon.data.http.RxUtils;
import com.ydl.ydlcommon.data.http.UpLoadLogUtils;
import com.ydl.ydlcommon.router.YdlCommonRouterManager;
import com.ydl.ydlcommon.ui.LoadingDialogFragment;
import com.ydl.ydlcommon.utils.ActivityManager;
import com.ydl.ydlcommon.utils.BuryPointUtils;
import com.ydl.ydlcommon.utils.NetworkParamsUtils;
import com.ydl.ydlcommon.utils.StringUtils;
import com.ydl.ydlcommon.utils.YDLCacheUtils;
import com.ydl.ydlcommon.utils.log.LogHelper;
import com.ydl.ydlcommon.utils.remind.HttpErrorUtils;
import com.ydl.ydlcommon.view.dialog.CommonDialog;
import com.ydl.ydlcommon.view.dialog.ListDialog;
import com.ydl.ydlcommon.view.dialog.NormalDialog;
import com.yidianling.common.tools.ToastUtil;
import com.yidianling.im.api.bean.IMExpertBuild;
import com.yidianling.im.api.bean.IMRequestCallback;
import com.yidianling.im.api.event.BlackEvent;
import com.yidianling.im.bean.GetReportReason;
import com.yidianling.im.bean.RMBlackCall;
import com.yidianling.im.bean.RemoveHistory;
import com.yidianling.im.bean.Report;
import com.yidianling.im.bean.ReportWorry;
import com.yidianling.im.bean.SetBlackCall;
import com.yidianling.im.config.constants.ImConstants;
import com.yidianling.im.event.UpdateTabUnreadNumEvent;
import com.yidianling.im.helper.MsgReceiveHelper;
import com.yidianling.im.http.ImRetrofitApi;
import com.yidianling.im.preference.ImTempData;
import com.yidianling.im.router.ImIn;
import com.yidianling.im.session.extension.CustomAttachTipMsg;
import com.yidianling.im.session.extension.CustomAttachmentOrderStatus;
import com.yidianling.im.session.extension.CustomAttachmentPhoneCallSystemNotice;
import com.yidianling.im.session.extension.CustomRecommendExpertListMsg;
import com.yidianling.im.session.extension.CustomSystemTips;
import com.yidianling.im.ui.page.fragment.bean.ChatItemBean;
import com.yidianling.im.ui.widget.ChatTeamHisDialog;
import com.yidianling.uikit.business.session.helper.MessageListPanelHelper;
import com.yidianling.uikit.custom.bridge.IP2PCustomActionHandler;
import com.yidianling.uikit.custom.http.response.RecommendExpertBean;

import org.jetbrains.annotations.Nullable;
import org.json.JSONObject;

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

import de.greenrobot.event.EventBus;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;


/**
 * 聊天扩展功能  点击时间处理
 * Created by Wi1ls on 2016/9/23;
 */
public class P2PCustomActionHandlerImpl implements IP2PCustomActionHandler {

    private boolean notPrepared;
    private String toChatUsername;
    private DocInfo docInfo = new DocInfo();
    private Activity mActivity;
    private int blackStatus;
    private int userType;
    /***是否来自倾述页面*/
    public int isFromQingShu = 0;

    public P2PCustomActionHandlerImpl(String toChatUsername,
                                      IMExpertBuild expert) {
        setExpertInfo(toChatUsername, expert);
    }

    @Override
    public void setExpertInfo(String toChatUsername, IMExpertBuild expert) {
        blackStatus = Integer.valueOf(expert.shareData.blackStatus);
        this.toChatUsername = toChatUsername;

        docInfo.toUid = expert.shareData.toUid;
        docInfo.doctorId = expert.shareData.doctorId;
        docInfo.listenerId = expert.shareData.listenerId;
        docInfo.name = expert.shareData.doctorName;
        docInfo.title = expert.shareData.title;
        docInfo.is_online = expert.shareData.is_online;
        docInfo.isChatOnline = expert.shareData.isChatOnline;
        docInfo.cover = expert.shareData.cover;
        docInfo.desc = expert.shareData.desc;
        docInfo.url_share = expert.shareData.url_share;
        docInfo.price = expert.shareData.price;
        docInfo.unitTxt = expert.shareData.unitTxt;
        docInfo.url = expert.shareData.url;

        docInfo.hasAvailableListenOrder = expert.shareData.hasAvailableListenOrder;
        docInfo.listenOrderCommentStatus = expert.shareData.listenOrderCommentStatus;
        docInfo.listenOrderCommentUrl = expert.shareData.listenOrderCommentUrl;
        docInfo.listenOrderUrl = expert.shareData.listenOrderUrl;
        docInfo.listenOrderDesc = expert.shareData.listenOrderDesc;
        docInfo.listenOrderRemainTime = expert.shareData.listenOrderRemainTime;

        docInfo.urlTitle = expert.shareData.urlTitle;
        docInfo.blackStatus = expert.shareData.blackStatus;
        docInfo.orderid = expert.shareData.params.orderid;
        docInfo.is_first = expert.shareData.is_first;
        docInfo.listenerIsOpen = expert.shareData.listenerIsOpen;
        docInfo.tag1 = expert.shareData.tag1;

        docInfo.doctorBriefInfoFeedbackRate = expert.doctorBriefInfo.feedbackRate;
        docInfo.doctorBriefInfoFeedbackRateForShow = expert.doctorBriefInfo.feedbackRateForShow;
        docInfo.doctorBriefInfoHelpLong = expert.doctorBriefInfo.helpLong;
        docInfo.doctorBriefInfoOrderNum = expert.doctorBriefInfo.orderNum;
        docInfo.doctorBriefInfoSmallImage = expert.doctorBriefInfo.smallImage;

        docInfo.isFollowed = expert.shareData.isFollowed;
        docInfo.commentCounter = expert.commentCounter;
        docInfo.commentCounterUrl = expert.commentCounterUrl;
        if (docInfo.commentList == null) {
            docInfo.commentList = new ArrayList();
        }
        docInfo.commentList.clear();
        if (expert.commentList != null) {
            docInfo.commentList.addAll(expert.commentList);
        }
        this.notPrepared = false;
    }

    public P2PCustomActionHandlerImpl(String toChatUsername,
                                      String toName, String head) {
        this.toChatUsername = toChatUsername;
        docInfo.toUid = toChatUsername;
        docInfo.name = toName;
        docInfo.cover = head;
        this.notPrepared = false;
    }

    public P2PCustomActionHandlerImpl(ChatItemBean chatItemBean) {
        this.toChatUsername = String.valueOf(chatItemBean.getToUid());
        this.userType = chatItemBean.getUtype();
        this.notPrepared = true;

        docInfo.toUid = String.valueOf(chatItemBean.getToUid());
        docInfo.name = chatItemBean.getTitle();
        docInfo.cover = chatItemBean.getHead();
    }

    /**
     * 聊天室使用
     */
    public P2PCustomActionHandlerImpl() {

    }

    /**
     * 群聊使用
     */
    public P2PCustomActionHandlerImpl(String doctorId) {
        docInfo.doctorId = doctorId;
    }

    @Override
    public int getUserType() {
        return userType;
    }

    @Override
    public void setUserType(int userType) {
        this.userType = userType;
    }

    @Override
    public int getSelfUserType() {
        return ImIn.INSTANCE.getUserInfo().getUser_type();
    }

    /**
     * 发红包
     */
    @Override
    public void sendRedPacket(Activity activity) {
        ImIn.INSTANCE.sendRedPacketIntent(activity, toChatUsername, 44);
    }

    /**
     * 判定是否是今天第一次发送提醒上线通知,不是的话则不发消息通知|普通消息
     */
    @Override
    public void judgeSendRemindMsg(String sessionId) {
        if (!TextUtils.isEmpty(YDLCacheUtils.Companion.getRemindTime(sessionId))) {
            Long lastRemindTime = Long.parseLong(YDLCacheUtils.Companion.getRemindTime(sessionId));
            Long nowTime = System.currentTimeMillis();
            if ((nowTime - lastRemindTime) / 1000 / 24 / 3600 < 1) {
                ToastUtil.toastShort("已提醒");
                return;
            }
        } else {
            YDLCacheUtils.Companion.saveRemindTime(sessionId, String.valueOf(System.currentTimeMillis()));
        }

        IMMessage message = MessageBuilder.createTextMessage(sessionId, SessionTypeEnum.P2P, "您好,请尽快上线,我在等您");
        message.setStatus(MsgStatusEnum.success);
        CustomMessageConfig config = new CustomMessageConfig();
        config.enableUnreadCount = false;
        message.setConfig(config);
        ImIn.INSTANCE.getImService().createTextMessage(sessionId, "您好,请尽快上线,我在等您", new IMRequestCallback<Void>() {
            @Override
            public void onSuccess(@Nullable Void aVoid) {
            }

            @Override
            public void onFailed(int i) {
            }

            @Override
            public void onException(@Nullable Throwable throwable) {
            }
        });
        ToastUtil.toastShort("已提醒");
    }

    /**
     * 发送专家推荐列表自定义消息
     */
    @Override
    public void sendRecommendExpertListMessage(String sessionId, ArrayList<RecommendExpertBean> recommendExpertList, int type, boolean showExpertList) {

        CustomRecommendExpertListMsg customRecommendExpertListMsg = new CustomRecommendExpertListMsg(recommendExpertList, type, showExpertList);
        IMMessage message = MessageBuilder.createCustomMessage(sessionId, SessionTypeEnum.P2P, customRecommendExpertListMsg);
        message.setStatus(MsgStatusEnum.success);
        CustomMessageConfig config = new CustomMessageConfig();
        config.enableUnreadCount = false;
        message.setConfig(config);
        NIMClient.getService(MsgService.class).saveMessageToLocal(message, true);
    }

    /**
     * 跳转到专家主页
     */
    @Override
    public void toExpertHome(String doctorId, String name, String cover) {
        // 跳转到专家主页
        String junmpurl = ImIn.INSTANCE.getExpertHost() + doctorId;
        String share_title = name + "咨询工作室";
        String share_head = cover;
        String share_context = "";
        String share_url = ImIn.INSTANCE.getShareExpertHost() + doctorId;

        H5Params h5Params = new H5Params(junmpurl, null);
        if (!TextUtils.isEmpty(share_url)) {
            ShareData shareData1 = new ShareData(junmpurl, share_title, share_head, share_context);
            h5Params.setShareData(shareData1);
        }
        h5Params.setShowMenu(true);
        if (mActivity != null) {
            NewH5Activity.start(mActivity, h5Params);
        }
    }

    /**
     * 检查用户是否绑定手机
     */
    @Override
    public boolean isBindPhone(final Activity activity, String toUid) {
        //小壹特殊处理,没有绑定也可以和小壹聊天
        if (toUid.equals(ImConstants.KEFUXIAOYI)) {
            return true;
        }

        try {
            String phone = ImIn.INSTANCE.getUserInfo().getPhone();
            if ("".equals(phone) || phone == null) {
                NormalDialog.Builder builder = new NormalDialog.Builder(activity, "left", true);
                builder.setTitle("");
                builder.setMessage(ImConstants.BIND_PHONE);
                builder.setPositiveButton("果断绑定",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                activity.startActivity(ImIn.INSTANCE.inputPhoneIntent(activity, ImConstants.BIND_PHONE_ACTION));
                                dialog.dismiss();
                            }
                        });
                builder.setNegativeButton("忍痛放弃",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });
                builder.create().show();
                return false;
            } else {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean HintMessageSend(final Activity activity, ReturnCallBack returnCallBack) {
        final boolean[] flag = {false};
        NormalDialog.Builder builder = new NormalDialog.Builder(activity, "left", true);
        builder.setTitle("");
        builder.setMessage(ImConstants.MESSAGE_IN_NUM);
        builder.setPositiveButton("确定",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        flag[0] = true;
                        returnCallBack.RetCallback();
                        dialog.dismiss();
                    }
                }).setNegativeButton("取消",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        flag[0] = false;
                        dialog.dismiss();
                    }
                });
        builder.create().show();
        return flag[0];
    }

    /**
     * 显示举报dialog
     */
    @Override
    public void showJubao(final Activity activity) {
        GetReportReason cmd = new GetReportReason();
        Disposable disposable = ImRetrofitApi.Companion.getImRetrofitApi().getReportReason(NetworkParamsUtils.getMaps(cmd))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(resp -> {
                    try {
                        if (resp.code != 0) {
                            ToastUtil.toastShort(resp.msg);
                            return;
                        }
                        LinkedTreeMap<String, String> reportReasonsmaps =
                                (LinkedTreeMap<String, String>) resp.data;
                        if (reportReasonsmaps == null) {
                            return;
                        }
                        List<Report> reports = new ArrayList<>();
                        for (Map.Entry<String, String> entry : reportReasonsmaps.entrySet()) {
                            Report report = new Report(entry.getKey(), entry.getValue());
                            reports.add(report);


                        }
                        report(activity, reports);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }, throwable -> HttpErrorUtils.Companion.handleError(activity, throwable));

    }

    @Override
    public void buryPoint(String eventName, JSONObject properties) {
        BuryPointUtils.buryPoint(eventName, properties);
    }

    /**
     * 发送自定义提醒消息
     */
    @Override
    public void sendCustomMsg() {
        CustomAttachTipMsg CustomAttachTipMsg = new CustomAttachTipMsg(ImConstants.FIRST_CHAT_TIP);
        IMMessage message = MessageBuilder.createCustomMessage(toChatUsername, SessionTypeEnum.P2P, CustomAttachTipMsg);
        NIMClient.getService(MsgService.class).sendMessage(message, false).setCallback(new RequestCallback<Void>() {
            @Override
            public void onSuccess(Void param) {

            }

            @Override
            public void onFailed(int code) {
                if (code == 7101) {
                    ToastUtil.toastLong(mActivity, "您已被对方拉黑!");
                } else if (code == 404) {
                    ToastUtil.toastLong(mActivity, "对象不见了!");
                } else {
                    UpLoadLogUtils.INSTANCE.upLoadLog("nim", code, "send message failed");
                }
            }

            @Override
            public void onException(Throwable exception) {

            }
        });
        MessageListPanelHelper.getInstance().notifyAddMessage(message);
    }

    @Override
    public void saveImTempData(String touid, String content) {
        if (touid == null || touid.equals("")) {
            return;
        }
        ImTempData.getInstance().addTempMsg(touid, content);
        EventBus.getDefault().post(new UpdateTabUnreadNumEvent());
    }

    @Override
    public String getImTempData(String touid) {
        return ImTempData.getInstance().getTempMsg(touid) == null ? "" : ImTempData.getInstance().getTempMsg(touid);
    }

    /**
     * 获取群聊历史记录dialog是否已显示过(0未提示,1已提示过)
     */
    @Override
    public void chatTeamHistoryTip(Activity activity) {
        if (!ImIn.INSTANCE.getChatTeamHisShow()) {
            //弹窗提示
            new ChatTeamHisDialog(activity).show();
        }
    }

    /**
     * 短时间内私聊次数过多,给予警示
     */
    @Override
    public void sendMsgToChatTip() {
//        CustomAttachChatTipMsg CustomAttachTipMsg = new CustomAttachChatTipMsg(getInfo().forbide_tip);
//        IMMessage message = MessageBuilder.createCustomMessage(toChatUsername, SessionTypeEnum.P2P, CustomAttachTipMsg);
//        message.setStatus(MsgStatusEnum.success);
//        MsgHelper.onMsgSend(message);

    }

    @Override
    public void h5ActivityStart(Context mActivity, String urlSuff, boolean isNeedFresh) {
        //跳转h5页面
        if (urlSuff == null) {
            ToastUtil.toastShort("参数错误");
            return;
        }
        String url = HttpConfig.Companion.getH5_URL() + urlSuff;

        H5Params h5Params = new H5Params(url, null);
        NewH5Activity.start(mActivity, h5Params);
    }

    @Override
    public void uploadSendMessageError(int errorCode) {
        UpLoadLogUtils.INSTANCE.upLoadLog("nim", errorCode, "send message failed");
    }

    /**
     * 举报
     */
    private void report(final Activity activity, final List<Report> reports) {

        final List<String> dialog_datas = new ArrayList<String>();
        for (Report report : reports) {
            dialog_datas.add(report.getContent());
        }

        int itemTextColor = Color.RED;
        ListDialog.Builder builder1 = new ListDialog.Builder(activity, dialog_datas, itemTextColor);
        builder1.SetLastStr("取消");
        builder1.SetLastButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder1.SetOnItemClickLister(new ListDialog.Builder.OnItemClickLister() {
            @Override
            public void onItemClick(final Dialog dialog, View view, int position) {
                ReportWorry cmd = new ReportWorry(Integer.valueOf(ImIn.INSTANCE.getUserInfo().getUid()), Integer.valueOf(reports.get(position).getReport_id()), 0, reports.get(position).getContent(), 2);
                ImRetrofitApi.Companion.getImRetrofitApi().reportWorry(NetworkParamsUtils.getMaps(cmd))
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(resp -> {
                            if (resp.code == 0) {
                                ToastUtil.toastShort(activity, "举报成功");
                            } else {
                                ToastUtil.toastShort(activity, resp.msg);
                            }
                            dialog.dismiss();
                        }, throwable -> {
                            HttpErrorUtils.Companion.handleError(activity, throwable);
                            dialog.dismiss();
                        });

            }

            @Override
            public void onItemLongClick(Dialog dialog, View view, int position) {

            }
        });
        builder1.create().show();
    }


    @Override
    public DocInfo getInfo() {
        return docInfo == null ? new DocInfo() : docInfo;
    }

    @Override
    public Boolean isNotPrepare() {
        return notPrepared;
    }


    @Override
    public boolean deleteMessage(IMMessage message) {
        if (message.getAttachment() instanceof CustomRecommendExpertListMsg) {
            //删除每次加载的消息记录中推荐专家列表消息
            return true;
        } else if (message.getAttachment() instanceof CustomSystemTips) {
            //过滤掉所有不符合条件的后端发送的系统消息
            if (((CustomSystemTips) message.getAttachment()).getHiddenApp() == 1
                    || ((CustomSystemTips) message.getAttachment()).getHiddenApp() == 3) {
                return true;
            }
        } else if (message.getAttachment() instanceof CustomAttachmentOrderStatus) {
            //已开启私聊 && 已经超过一个小时
            if (((CustomAttachmentOrderStatus) message.getAttachment()).isStartChatMessage()
                    && isMessageTimeOut(message)) {
                return true;
            }
        } else if (message.getAttachment() instanceof CustomAttachmentPhoneCallSystemNotice) {
            //(留言 消息 || 邀请开通 消息) && 已经超过一小时
            if ((((CustomAttachmentPhoneCallSystemNotice) message.getAttachment()).isLeaveMessage()
                    || ((CustomAttachmentPhoneCallSystemNotice) message.getAttachment()).isInviteMessage())
                    && isMessageTimeOut(message)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 消息是否超过一小时
     *
     * @param message
     * @return true 超过 false 未超过
     */
    private boolean isMessageTimeOut(IMMessage message) {
        return (System.currentTimeMillis() - message.getTime()) > 3600 * 1000;
    }

    @Override
    public void setDoctorStatus(int status) {
        if (docInfo != null) {
            docInfo.isChatOnline = status;
        }
    }

    @Override
    public void setDoctorBusyNum(int num) {
        if (docInfo != null) {
            docInfo.busyTotal = num;
        }
    }

    @Override
    public void setmActivity(Activity mActivity) {
        this.mActivity = mActivity;
    }

    @Override
    public Activity getmActivity() {
        return mActivity;
    }


    @Override
    public void clickMoreIcon() {
        if (mActivity == null || mActivity.isFinishing()) {
            return;
        }
        List<String> list = new ArrayList<>();
        if (ImConstants.KEFUXIAOYI.equals(toChatUsername) || "4108805".equals(toChatUsername)) {
            list.add("历史聊天记录");
            list.add("客服热线");
        } else {
            list.add("投诉反馈");
            if (blackStatus == 1) {
                list.add("拉黑");
            } else if (blackStatus == 2) {
                list.add("取消拉黑");
            }
            if (userType == 1) {
                list.add("ta的主页");
            }
            if (userType == 2) {
                list.add("访问专家主页");
            }
            list.add("历史聊天记录");
            list.add("删除聊天记录");
        }
        ListDialog.Builder dialog = new ListDialog.Builder(mActivity, list, 0);
        list.add("取消");

        dialog.create().show();

        dialog.SetOnItemClickLister(new ListDialog.Builder.OnItemClickLister() {
            @Override
            public void onItemClick(Dialog dialog, View view, int position) {
                LogHelper.Companion.getInstance().writeLogSync(String.format("聊天界面:%s", list.get(position)));
                switch (list.get(position)) {
                    case "投诉反馈":
                        startFeedback(mActivity);
                        break;
                    case "返回首页":
                        ImIn.INSTANCE.mainIntent(mActivity, 0);
                        break;
                    case "客服热线":
                        showCallDialog();
                        break;
                    case "访问专家主页":
                        skip2ExpertHome();
                        break;
                    case "历史聊天记录":
                        historyMsg();
                        break;
                    case "拉黑":
                        setBlack();
                        break;
                    case "取消拉黑":
                        rmBlack();
                        break;
                    case "删除聊天记录":
                        deleteChatHistory();
                        break;
                    case "ta的主页":
                        showUserHome();
                        break;
                    case "取消":
                        break;
                }
                dialog.dismiss();
            }

            @Override
            public void onItemLongClick(Dialog dialog, View view, int position) {

            }
        });
    }

    /**
     * 删除聊天记录
     */
    private void deleteChatHistory() {
        CommonDialog dialog = CommonDialog.create(mActivity);
        dialog.setMessage("确定删除与ta的聊天记录?");
        dialog.setCancelAble(true);
        dialog.setLeftOnclick("再考虑下", v -> dialog.dismiss());
        dialog.setRightClick("立即删除", v -> {
            LoadingDialogFragment loadingDialog = LoadingDialogFragment.Companion.newInstance("正在删除");
            loadingDialog.show(((AppCompatActivity) mActivity).getSupportFragmentManager(), null);
            RemoveHistory cmd = new RemoveHistory();
            cmd.toUid = getInfo().toUid;
            cmd.type = 1;
            Disposable disposable = ImRetrofitApi.Companion.getImRetrofitApi().rmHistory(NetworkParamsUtils.getMaps(cmd))
                    .subscribeOn(Schedulers.io())
                    .compose(RxUtils.INSTANCE.resultData())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(objectBaseResponse -> {
                        loadingDialog.hide();
                        ToastUtil.toastShort("聊天记录已删除");
                        NIMClient.getService(MsgService.class).clearChattingHistory(cmd.toUid, SessionTypeEnum.P2P);
                        MessageListPanelHelper.getInstance().notifyClearMessages(cmd.toUid);

                    }, throwable -> {
                        loadingDialog.hide();
                        HttpErrorUtils.Companion.handleError(mActivity, throwable);
                    });
        });
        dialog.show();
    }

    private void setBlack() {
        SetBlackCall cmd = new SetBlackCall(toChatUsername);
        Disposable disposable = ImRetrofitApi.Companion.getImRetrofitApi().setBlackCall(NetworkParamsUtils.getMaps(cmd))
                .subscribeOn(Schedulers.io())
                .compose(RxUtils.INSTANCE.resultData())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(objectBaseResponse -> {
                    ToastUtil.toastShort("已加入黑名单");
                    BlackEvent changeEvent = new BlackEvent(true);
                    EventBus.getDefault().post(changeEvent);
                    blackStatus = 2;
                }, throwable -> {
                    HttpErrorUtils.Companion.handleError(mActivity, throwable);
                });
    }


    private void rmBlack() {
        RMBlackCall cmd = new RMBlackCall(toChatUsername);
        Disposable disposable = ImRetrofitApi.Companion.getImRetrofitApi().rmBlackCall(NetworkParamsUtils.getMaps(cmd))
                .subscribeOn(Schedulers.io())
                .compose(RxUtils.INSTANCE.resultData())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(objectBaseResponse -> {
                    ToastUtil.toastShort("已移出黑名单");
                    BlackEvent changeEvent = new BlackEvent(true);
                    EventBus.getDefault().post(changeEvent);
                    blackStatus = 1;
                }, throwable -> {
                    HttpErrorUtils.Companion.handleError(mActivity, throwable);
                });
    }

    //    @Override
//    protected void notifyChange() {
//        super.notifyChange();
//        EventBus.getDefault().post(new NotifyRecentListChangeEvent(1));
//    }

    /**
     * 跳转到专家主页
     */
    private void skip2ExpertHome() {
        // 跳转到专家主页
        if (docInfo.doctorId != null) {
            String junmpurl = ImIn.INSTANCE.getExpertHost() + docInfo.doctorId;
            String share_title = docInfo.name + "咨询工作室";
            String share_head = docInfo.cover;
            String share_context = "";
            String share_url = ImIn.INSTANCE.getShareExpertHost() + docInfo.doctorId;

            H5Params h5Params = new H5Params(junmpurl, null);
            if (!TextUtils.isEmpty(share_url)) {
                ShareData shareData1 = new ShareData(junmpurl, share_title, share_head, share_context);
                h5Params.setShareData(shareData1);
            }
            h5Params.setShowMenu(true);
            if (mActivity != null) {
                NewH5Activity.start(mActivity, h5Params);
            }
        }
    }

    @Override
    public void jump() {
        //预约评价  微问诊评价  倾诉评价

        H5Params h5Params = new H5Params(ImConstants.Companion.getYYPJ() + docInfo.orderid, null);
        NewH5Activity.start(mActivity, h5Params);
    }

    @Override
    public void h5Video() {
        H5Params h5Params = new H5Params(ImConstants.Companion.getH5VIDEO_INFO(), null);
        NewH5Activity.start(mActivity, h5Params);
    }


    /**
     * 判断是否需要发送自定义消息
     *
     * @param isCheckFrom 是否需要检查是否从倾述流程进入
     */
    @Override
    public void isNeedSendMsg(boolean isCheckFrom) {
        //从倾述进入私聊
        //未上线前提下:
        // 未留言,自动发送留言
        //已留言:不处理
        if (!isCheckFrom || isFromQingShu == 1) {//是从倾述进入
            //判断当前是否在线
            if (docInfo.is_online == 2) {//离线
                //判断今天是否有给老师留过言
                String localTime = YDLCacheUtils.Companion.getNoticeSendTime(YdlCommonRouterManager.INSTANCE.getYdlCommonRoute().getUid() + "", docInfo.toUid);
                if (!StringUtils.compareTime(localTime)) {//不是同一天
                    //自动发送老师现在不在,请留言的提示
                    CustomAttachmentPhoneCallSystemNotice systemNotice = new CustomAttachmentPhoneCallSystemNotice("2");
                    IMMessage message = MessageBuilder.createCustomMessage(toChatUsername, SessionTypeEnum.P2P, systemNotice);
                    message.setStatus(MsgStatusEnum.success);
                    CustomMessageConfig config = new CustomMessageConfig();
                    config.enableUnreadCount = false;
                    message.setConfig(config);
                    YDLCacheUtils.Companion.saveNoticeSendTime(YdlCommonRouterManager.INSTANCE.getYdlCommonRoute().getUid() + "", getInfo().toUid, System.currentTimeMillis() + "");
                    NIMClient.getService(MsgService.class).saveMessageToLocalEx(message, false, message.getTime()).setCallback(new RequestCallback<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                        }

                        @Override
                        public void onFailed(int i) {
                            YDLCacheUtils.Companion.saveNoticeSendTime(YdlCommonRouterManager.INSTANCE.getYdlCommonRoute().getUid() + "", getInfo().toUid, "");
                        }

                        @Override
                        public void onException(Throwable throwable) {
                            YDLCacheUtils.Companion.saveNoticeSendTime(YdlCommonRouterManager.INSTANCE.getYdlCommonRoute().getUid() + "", getInfo().toUid, "");

                        }
                    });
                }
            }
        }
    }


    /**
     * 倾诉
     */
    @Override
    public void confide() {
        if (1 == docInfo.listenerIsOpen && !TextUtils.isEmpty(docInfo.doctorId) && !docInfo.doctorId.equals("0")) {
            H5Params h5Params = new H5Params(ImConstants.Companion.getYTZDETAIL() + docInfo.doctorId + "?id=" + docInfo.listenerId + "&toConfide=1", null);
            String share_title = "壹点灵电话倾诉";
            String share_context = "壹点灵电话倾诉";
            ShareData shareData1 = new ShareData(HttpConfig.Companion.getMH5_URL() + "listen", share_title, null, share_context);
            h5Params.setShareData(shareData1);
            NewH5Activity.start(mActivity, h5Params);
        } else {
            if (userType == 2) {//专家
                //发送邀请老师的通知
                CustomAttachmentPhoneCallSystemNotice systemNotice = new CustomAttachmentPhoneCallSystemNotice("1");
                IMMessage message = MessageBuilder.createCustomMessage(toChatUsername, SessionTypeEnum.P2P, systemNotice);
                message.setStatus(MsgStatusEnum.success);
                CustomMessageConfig config = new CustomMessageConfig();
                config.enableUnreadCount = false;
                message.setConfig(config);
                NIMClient.getService(MsgService.class).saveMessageToLocalEx(message, false, message.getTime());
                MessageListPanelHelper.getInstance().notifyAddMessage(message);
            } else {
                ToastUtil.toastShort("对方还未开通该服务");
            }
        }
    }

    /**
     * 帮助
     */
    @Override
    public void help() {

        H5Params h5Params = new H5Params("http://static.yidianling.com/mobile/html/chat_help_app.html", null);
        h5Params.setShowMenu(true);
        NewH5Activity.start(mActivity, h5Params);
    }

    @Override
    public void makeColections(String toUid) {
        H5Params h5Params = new H5Params(HttpConfig.Companion.getMH5_URL() + "zx/chooseCounselor?toUid=" + toUid, null);
        NewH5Activity.start(mActivity, h5Params);
    }

    @Override
    public void clear(String accid) {
        MsgReceiveHelper.updateNum(accid, 0);
    }

    @Override
    public void put(Activity a) {
        //添加activity
        ActivityManager.Companion.getInstance().addStack(a);
    }

    @Override
    public void showHelp(String url) {
        H5Params h5Params = new H5Params(url, null);
        NewH5Activity.start(mActivity, h5Params);

    }

    @Override
    public void resumeUm(Activity activity) {
        MobclickAgent.onResume(activity);
    }

    @Override
    public void pauseUm(Activity activity) {
        MobclickAgent.onPause(activity);
    }

    private void historyMsg() {
        H5Params h5Params = new H5Params(HttpConfig.Companion.getH5_URL() + "consult/history2?toUid=" + toChatUsername, null);
        h5Params.setShowMenu(true);
        NewH5Activity.start(mActivity, h5Params);
    }

    @Override
    public void showDingdan(String url) {
        if (url.contains("book")) {

            H5Params h5Params = new H5Params(url + "orderid=" + docInfo.orderid, null);
            h5Params.setShowMenu(true);
            NewH5Activity.start(mActivity, h5Params);
        } else {

            H5Params h5Params = new H5Params(url, null);
            NewH5Activity.start(mActivity, h5Params);
        }
    }

    @Override
    public void showZhuanjPage() {
        skip2ExpertHome();
    }

    /**
     * 跳转用户主页
     */
    @Override
    public void showUserHome() {
        if (ImIn.INSTANCE.membersIntent(mActivity, docInfo.toUid) != null) {
            mActivity.startActivity(ImIn.INSTANCE.membersIntent(mActivity, docInfo.toUid));
        }
    }


    private void showCallDialog() {
        try {
            final String tel = PlatformDataManager.INSTANCE.getRam().getGlobalInfo() == null ? "400-765-1010" : PlatformDataManager.INSTANCE.getRam().getGlobalInfo().info.tel;

            String con = "\n400-765-1010\n早8:30-凌晨2:00";

            if (PlatformDataManager.INSTANCE.getRam().getGlobalInfo() != null && PlatformDataManager.INSTANCE.getRam().getGlobalInfo().info != null) {
                con = PlatformDataManager.INSTANCE.getRam().getGlobalInfo().info.tel + "\n" + PlatformDataManager.INSTANCE.getRam().getGlobalInfo().info.work_time;
            }

            new CommonDialog(mActivity)
                    .setTitle("欢迎致电壹点灵客服热线")
                    .setMessage(con)
                    .setLeftOnclick("取消", v1 -> {

                    }).setRightClick("拨打", v12 -> {
                Intent phoneIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + tel));
                mActivity.startActivity(phoneIntent);
            }).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void popCallDialog(Context context) {
        showCallDialog();
    }

    @Override
    public void startFeedback(Context context) {
        ImIn.INSTANCE.feedBackIntent((Activity) context);
    }

    @Override
    public void startHelp(Context context) {

        H5Params params = new H5Params(HttpConfig.Companion.getH5_URL() + "help/", "");
        params.setShowMenu(true);
        NewH5Activity.start(context, params);
    }
}