import store from '../store'

import previewHandle from './handler/previewHandle'
import taskResultNotice from './handler/taskResultNotice'
import { postSnsTaskResultNoticeHandler } from './handler/circleNoticeHandler'

import { MessageBox, Message, Notification } from 'element-ui'
import { TriggerUserLabelTask } from '@/api/webSocketApi'

export default function handler(e) {
  let msg = JSON.parse(e.data)
  let msgType = msg.msgType
  let message = msg.message
  if (msgType !== 'AddTaskTimeInfoResp') {
    message = msg.message ? JSON.parse(msg.message) : {}
  }
  switch (msgType) {
    // server 设备(手机客户端、客服客户端)获取通信token响应
    case 'DeviceAuthRsp':
      previewHandle.deviceAuthRspHandler(message)
      break
    // sdk 设备授权后退出(仅用于服务端内部)
    // case 'DeviceExitNotice':
    //   console.log('退出登陆成功')
    //   break
    // sdk 账号强制下线通知
    case 'AccountForceOfflineNotice':
      console.log('账号强制下线通知', msg)
      break
    // sdk 手机客户端微信上线通知
    case 'WwOnlineNotice':
      previewHandle.wwOnlineNoticeHandler(message)
      break
    // sdk 手机客户端微信下线通知
    case 'WwOfflineNotice':
      previewHandle.wwOfflineNoticeHandler(message)
      break
    // server 微信列表
    case 'GetWeChatsResp':
      store.commit('conversation/SET_WECHATS', message)
      break
    // sdk 推送聊天会话（包含群聊信息） ok
    case 'ConversationPushNotice':
      store.commit('conversation/SET_CONVERSATIONS', message)
      break
    // sdk 会话新增通知 ok
    case 'ConversationAddNotice':
      console.log('会话新增通知', message)
      break
    // sdk 会话改变通知 ok
    case 'ConversationChangedNotice':
      store.commit('conversation/CHANGE_CONVERSATIONS', message)
      break
    // sdk 微信好友发来聊天消息 ok
    case 'FriendTalkNotice':
      // electron 新消息闪烁
      if (store.getters.currentMode === 'electron') {
        const { ipcRenderer } = window.require('electron')
        ipcRenderer.send('operations', 'newMsg')
      }
      // 更新会话表
      store.dispatch('conversation/UpdateConversations', message)
      // 消息插入nedb chats
      store.dispatch('conversation/AddChats', message)
      break
    // sdk 手机上回复好友的聊天消息 ok
    case 'TalkToFriendNotice':
      // 更新会话表
      store.dispatch('conversation/UpdateConversations', message)
      // 消息插入nedb chats
      store.dispatch('conversation/AddChats', message)
      break
    // sdk 手机端向服务端通知聊天执行结果
    case 'TalkToFriendTaskResultNotice':
      if (message.Success) {
        store.dispatch('conversation/RemoveLocalChat', message)
      }
      break
    // 消息撤回通知
    case 'MsgRevokeNotice':
      store.commit('conversation/UPDATE_CHAT', message)
      break
    // sdk 发朋友圈结果返回 ok
    case 'PostSnsTaskResultNotice':
      postSnsTaskResultNoticeHandler(message)
      break
    // sdk 获取我的朋友圈列表结果返回 ok
    case 'PullMySnsListTaskResultNotice':
      store.dispatch('circle/SetCircles', message)
      break
    // sdk 获取单个朋友圈结果返回 ok
    case 'GetSnsDataTaskResultNotice':
      store.commit('circle/UPDATE_CIRCLES_BY_ONE', message)
      break
    // sdk 获取二维码结果推送 ok
    case 'PullMyQrCodeTaskResultNotice':
      store.commit('tools/UPDATE_QR_CODE', message)
      break
    // sdk 微信好友列表推送，用于从微信好友中添加客户 ok
    case 'WxFriendPushNotice':
      store.commit('tools/SET_WX_FRIENDS', message)
      break
    // 好友信息
    case 'GetContactInfoTaskResultNotice':
      store.dispatch('conversation/UpdateFriend', message)
      break
    // 手机端推送新客户列表
    case 'NewCustomerPushNotice':
      store.commit('tools/SET_NEW_FRIENDS', message)
      break

    // 推送客户标签
    case 'UserLabelPushNotice':
      store.commit('conversation/UPDATE_USER_LABELS', message)
      break
    // 客户标签变化推送，未实现
    case 'UserLabelChangedNotice':
      console.log('UserLabelChangedNotice', message)
      //   TriggerUserLabelTask(message.WxId)
      break
    // 新增或修改个人标签结果返回
    case 'UserLabelModifyTaskResultNotice':
      TriggerUserLabelTask(message.WxId)
      break

    // sdk 手机端推送企业联系人 ok
    case 'ContactPushNotice':
      store.dispatch('conversation/UpdateContacts', message)
      break
    // sdk 手机端推送部门信息列表 ok
    case 'DepartmentPushNotice':
      if (message.Departs && message.Departs.length > 0) {
        store.dispatch('conversation/UpdateDepartments', message)
      }
      break
    // sdk 手机端推送我的客户 ok
    case 'CustomerPushNotice':
      store.dispatch('conversation/UpdateCustomers', message)
      break
    // 历史消息推送 ok
    case 'HistoryMsgPushNotice':
      console.log('HistoryMsgPushNotice', message)
      store.dispatch('conversation/AddChatsByHistory', message)
      break
    // sdk 推送客户公司信息 ok
    case 'CorporationPushNotice':
      if (message.Corps && message.Corps.length > 0) {
        // 更新会话
        store.dispatch('conversation/UpdateCorporations', message)
      }
      break
    // 文件下载任务或手机端自动下载结果推送
    case 'DownloadFileResultNotice':
      store.commit('conversation/UPDATE_CHATS_BY_DETAIL', message)
      break
    // 新客户变更通知(别人申请加你为好友)
    case 'NewCustomerAddedNotice':
      Notification({
        title: '通知',
        message: `${store.getters['conversation/wechatsNameMap'][message.WxId] || message.WxId}有人加你为好友！`
      })
      break
    // sdk 查询手机状态返回结果
    case 'PhoneStateTaskResultNotice':
      store.commit('tools/SET_PHONE_STATE', message)
      break

    // sdk 任务执行结果通知 ing
    case 'TaskResultNotice':
      taskResultNotice.taskResultMap(message)
      break

    // =====================================================================
    // =====================================================================

    // sdk 联系人新增，未实现
    case 'ContactAddNotice':
      // conversationHandle.conversationPushNoticeHandle(msg)
      break
    // sdk 联系人删除，未实现
    case 'ContactDelNotice':
      // conversationHandle.conversationPushNoticeHandle(msg)
      break
    // sdk 客户新增，未实现
    case 'CustomerAddNotice':
      // conversationHandle.conversationPushNoticeHandle(msg)
      break
    // sdk 客户删除，未实现
    case 'CustomerDelNotice':
      // conversationHandle.conversationPushNoticeHandle(msg)
      break

    // sdk 部门信息变化推送，未实现
    case 'DepartmentChangedNotice':
      // conversationHandle.conversationPushNoticeHandle(msg)
      break

    // sdk 手机上消息已读
    case 'PostMessageReadNotice':
      console.log('PostMessageReadNotice', message)
      break

    // ============================================================
    // 以下是服务端的回调
    // ============================================================
    // server 返回
    case 'MsgReceivedAck':
      switch (msg.refMsgId) {
        case 1001:
          // console.log('心跳返回。。。')
          break
        default:
          // console.log('服务端收到指令返回')
          break
      }
      break
    // ============================================================
    // 以下是 错误用到的回调
    // ============================================================
    case 'Error':
      {
        let errMsg = JSON.parse(msg.message)
        let errorCode = errMsg.ErrorCode
        let errorMsg = errMsg.ErrorMsg
        if (errMsg.ErrorCode === 'NoRight' && errorMsg === '账号密码错误') {
          store.commit('websocket/SET_LOGIN_LOADING', false)
        }
        // 单点登陆
        if (errMsg.ErrorCode === 'NoRight' && (errorMsg === '账号已在别处登陆' || errorMsg === 'token过期')) {
          errorMsg = errorMsg + '，请重新登陆 !'
          MessageBox.alert(errorMsg, errorCode, {
            type: 'error',
            showClose: false,
            confirmButtonText: '确定并退出',
            callback: () => {
              // 清除token
              store.commit('SET_WEBSOCKET_TOKEN', '')
            }
          })
        } else {
          console.log(errMsg)
          Message.error({
            type: 'error',
            message: errorMsg,
            duration: 2000,
            showClose: true
          })
        }
      }
      break

    default:
      console.log('未知的任务', msg)
      break
  }
}
