import * as CallLib from '@/uni_modules/RongCloud-CallWrapper/lib/index'
import * as IMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import store from '@/store/index.js'
import im from "@/utils/im/index.js"
import utils from '../index.js'
import {
    getUserInfo
} from '@/apis/interfaces/im.js'

// 维护消息列表，检查是否需要通知声音，设置新消息提醒的数量
const onReceiveMessage = (message) => {
    IMLib.getConversationNotificationStatus(message.conversationType, message.targetId, ({
        code,
        status
    }) => {
        if (code === 0) {
            if (status) {
                // triTone()
            }
        }
    })
    im.setNotifyBadge()
    // 发布全局事件，有新消息，刷新会话列表
    uni.$emit('onReceiveMessage', message)
    // 这个是为了更新消息列表页的
    uni.$emit('onReceiveMessage_' + message.targetId, message)
}

// 检测联系人信息，不存在的时候，从服务端获取
const checkContactExists = (message) => {
    if (!store.getters.contactIsExist(message.targetId)) {
        getUserInfo(message.targetId).then(res => {
            console.log('targetId', res);
            store.dispatch('initContact', res)
        }).catch(err => {
            console.error('getUserInfo ERR', err)
        })
    }
    if (!store.getters.contactIsExist(message.senderUserId)) {
        getUserInfo(message.senderUserId).then(res => {
            console.log('senderUserId', message.senderUserId, res);
            store.dispatch('initContact', res)
        }).catch(err => {
            console.error('getUserInfo ERR', err)
        })
    }
}

// 允许通知的消息类型，触发更新消息列表操作,提示音
const notifyMsgTypes = [
    IMLib.ObjectName.Text,
    IMLib.ObjectName.File,
    IMLib.ObjectName.Image,
    IMLib.ObjectName.GIF,
    IMLib.ObjectName.Location,
    IMLib.ObjectName.Voice,
    IMLib.ObjectName.HQVoice,
    IMLib.ObjectName.Sight
]

const imLibListeners = () => {
    // 添加连接状态监听函数 
    IMLib.addConnectionStatusListener((res) => {
        console.error('连接状态监听', res.data.status)
        uni.$emit('onConnectionStatusChange', res.data.status)
    })
    // 添加消息监听函数
    IMLib.addReceiveMessageListener((res) => {
        const message = res.data.message
        console.error('[收到消息]', message)
        checkContactExists(message)
        if (utils.inArray(message.objectName, notifyMsgTypes)) {
            onReceiveMessage(message)
        } else if (message.objectName === IMLib.ObjectName.ProfileNotification) {
            uni.$emit('onUpdateProfile_' + message.targetId)
            // 更新联系人信息
            store.dispatch('updateContact', JSON.parse(message.content.data))
            // 调用完更新之后，删除这条消息
            IMLib.deleteMessagesByIds([message.messageId])
        } else if (message.objectName === IMLib.ObjectName.ContactNotification) {
            if (message.content.operation === 'Request') {
                // 触发一个新好友的通知事件，【会话列表，通讯录，新朋友】页面
                uni.$emit('onNewContactConversation', message)
                uni.$emit('onNewContactFriends', message)
                uni.$emit('onNewContactPendings', message)
            } else if (message.content.operation === 'Delete') {
                IMLib.cleanHistoryMessages(1, message.targetId, message.sentTime, false)
                // 解散了就删了吧
                IMLib.removeConversation(1, message.targetId)
                // 刷新会话列表
                uni.$emit('onUserDelete_' + message.targetId)
                uni.$emit('onReceiveMessage', message)
            }
        } else if (message.objectName === IMLib.ObjectName.GroupNotification) {
            // 解散群
            if (message.content.operation === 'Dismiss') {
                IMLib.cleanHistoryMessages(3, message.targetId, message.sentTime,
                    false)
                // 解散了就删了吧
                IMLib.removeConversation(3, message.targetId)
                // 发布群解散的消息
                uni.$emit('onGroupDismiss')
                uni.$emit('onGroupDismiss_' + message.targetId)
            } else if (message.content.operation === 'REMOVE') {
                // 要判断是否当前用户，然后把当前用户踢出到主页去， 删除聊天记录，会话列表
                if (message.content.extra == store.getters.sender.userId) {
                    IMLib.cleanHistoryMessages(3, message.targetId, message.sentTime,
                        false)
                    // 解散了就删了吧
                    IMLib.removeConversation(3, message.targetId)
                    // 为了更新群列表
                    uni.$emit('onGroupDismiss')
                    uni.$emit('onGroupRemoveYou_' + message.targetId)
                }
                uni.$emit('onReceiveMessage_' + message.targetId, message)
                // 这个是为了更新消息列表页的
            }
            // 触发刷新会话列表
            uni.$emit('onReceiveMessage', message)
        }
    })
    // 监听私聊消息已读回执
    IMLib.addReadReceiptReceivedListener(({
        data
    }) => {
        console.error("监听私聊消息已读回执: ", data);
        uni.$emit('onReadReceiptReceived', data)
    })
    // 监听消息撤回操作
    IMLib.addRecallMessageListener(({
        data
    }) => {
        IMLib.getMessage(data.messageId, ({
            message
        }) => {
            console.error("消息撤回: ", message);
            im.setNotifyBadge()
            uni.$emit('onReceiveMessage', message)
            uni.$emit('onRecallMessage_' + message.targetId, message)
        })
    })
    // 监听需要群聊消息回执
    IMLib.addReceiptRequestListener(({
        data
    }) => {
        uni.$emit('onReceiptRequest', data)
    })
    // 群消息已读的回执
    IMLib.addReceiptResponseListener(({
        data
    }) => {
        // 获取本地消息
        IMLib.getMessageByUId(data.messageUId, ({
            message
        }) => {
            const readers = Object.keys(data.users).length
            const extra = JSON.stringify({
                readers
            })
            // 在消息的扩展数据中，设置已读数量
            IMLib.setMessageExtra(message.messageId, extra, (result) => {
                message.extra = extra
                uni.$emit('onReceiptResponse', message)
            })
        })
    })
}

const callLibListeners = () => {
    // 音视频通话相关的
    // 监听通话呼入
    CallLib.onCallReceived(({
        data
    }) => {
        console.error('onCallReceived');
        uni.navigateTo({
            url: '/pages/im/private/call?targetId=' + data.targetId + '&mediaType=' +
                data.mediaType
        })
    })
    // 通话建立成功
    CallLib.onCallConnected(() => {
        uni.$emit('onCallConnected')
    })
    // 外呼
    CallLib.onCallOutgoing((res) => {
        console.error('onCallOutgoing', res);
        uni.$emit('onCallOutgoing')
    })
    // 远端响铃
    CallLib.onRemoteUserRinging((res) => {
        console.error('onRemoteUserRinging', res);
        uni.$emit('onRemoteUserRinging')
    })
    // 远端加入
    CallLib.onRemoteUserJoined((res) => {
        console.error('远端接听');
        uni.$emit('onRemoteUserJoined')
    })
    // 断开链接
    CallLib.onCallDisconnected((res) => {
        console.error('断开链接', res)
        uni.$emit('onCallDisconnected')
    })
    // 远端挂断
    CallLib.onRemoteUserLeft((res) => {
        console.error('远端离开', res)
        uni.$emit('onRemoteUserLeft')
    })
}

export default {
    imLibListeners,
    callLibListeners
}
