import base64 from '@/utils/base64.js'
import { sendSock } from '../../websocket/websocket'
import { generateTaskId } from '@/utils/common'

// state
const state = {
  loginLoading: false // longinPage loading开关
}

// getters
const getters = {
  loginLoading: (state) => state.loginLoading
}

// actions
const actions = {
  // 从sdk 获取微信列表 返回 GetWeChatsResp
  GetWeChatsReq({ rootGetters, commit }) {
    let msg = {
      MsgType: 'GetWeChatsReq',
      Content: {
        AccountType: rootGetters.currentUser.AccountType,
        id: rootGetters.currentUser.UnionId
      }
    }
    commit('SEND_SOCK', msg)
  },

  // 告诉server退出登陆 返回 DeviceExitNotice
  AccountLogoutNotice({ rootGetters, commit }) {
    let msg = {
      Id: 3054,
      MsgType: 'AccountLogoutNotice',
      Content: {
        id: Number(rootGetters.currentUser.UnionId)
      },
      AccessToken: rootGetters.webSocketToken
    }
    commit('SEND_SOCK', msg)
  },

  // =============================================================================
  // 以下是 wxtools页面相关的sdk
  // =============================================================================
  // sdk 获取好友申请列表 返回FriendAddReqListNotice
  PullFriendAddReqListTask({ commit }, wechatId) {
    let content = {
      WeChatId: wechatId, // 所属微信
      StartTime: 0, // 毫秒，0 则全部
      OnlyNew: false, // 只获取未读的请求
      GetAll: true // 获取所有的加好友请求信息，包括已经添加的
    }
    let msg = { MsgType: 'PullFriendAddReqListTask', Content: content }
    commit('SEND_SOCK', msg)
  },

  // sdk 接受好友请求 返回FriendAddNotice
  AcceptFriendAddRequestTask({ rootGetters, commit }, row) {
    let wechatId = rootGetters['conversation/currentWeChatId']
    let msg = {
      MsgType: 'AcceptFriendAddRequestTask',
      Content: {
        WeChatId: wechatId, // 商家个人微信内部全局唯一识别码
        FriendId: row.FriendId, // 请求的好友微信内部全局唯一识别码
        Operation: 1, // 处理结果 0忽略 1接受 2拒绝
        Remark: row.Remark || '' // 其他备注信息
        // FriendNick: 7, // 好友的微信昵称 没用
        // ReplyMsg: 8,  // 拒绝时的回复消息
        // TaskId: 9, //任务Id
      }
    }
    commit('SEND_SOCK', msg)
  },

  // sdk 清理僵尸粉 返回PostFriendDetectCountNotice
  PostFriendDetectTask({ rootGetters, dispatch, commit }, clearForm) {
    let content = {
      WeChatId: clearForm.wechatId, // 微信id
      TaskId: generateTaskId().toString(), // 清粉任务ID
      // Message: 3, // 消息内容（当前发空名片，该字段暂时废弃）
      OnlyCheck: !clearForm.delete, // false 检测到立即删除，true 不删除，通知到服务端
      SkipHour: clearForm.time, // 跳过多少小时内有互动的好友（聊天，朋友圈互动,上次已检测等），缺省72小时
      Mode: clearForm.circle ? 6 : 1 // 1不检测朋友圈 6检测朋友圈
    }
    let msg = {
      MsgType: 'PostFriendDetectTask',
      Content: content
    }
    commit('SEND_SOCK', msg)
  },

  // sdk 停止清理僵尸粉 返回TaskResultNotice
  PostStopFriendDetectTask({ dispatch, commit }, wechatId) {
    let content = {
      WeChatId: wechatId, // 微信id
      TaskId: generateTaskId().toString() // 清粉任务ID
    }
    let msg = {
      MsgType: 'PostStopFriendDetectTask',
      Content: content
    }
    commit('SEND_SOCK', msg)
  },

  // =============================================================================
  // 以下是 群发 页面相关的sdk
  // =============================================================================

  // sdk 群发助手 返回TaskResultNotice
  WeChatGroupSendTask({ dispatch, commit }, message) {
    let content = {
      TaskId: generateTaskId().toString(), // 任务id
      FriendIds: message.FriendIds, // 目标人群id列表
      ContentType: message.ContentType, // 内容类型
      Content: message.Content, // 文字内容 或 图片列表
      WeChatId: message.WeChatId // 微信号id
    }
    let msg = { MsgType: 'WeChatGroupSendTask', Content: content }
    commit('SEND_SOCK', msg)
    // 任务保存到nedb数据库
    let doc = {}
    for (const key in content) {
      if (content.hasOwnProperty(key)) {
        doc[key] = content[key]
      }
    }
    doc.MsgType = 'WeChatGroupSendTask'
    dispatch('groupSend/AddGroupSendTask2Nedb', doc, { root: true })
  },

  // ****************************************************************************
  // 以下是 conversation页面相关的sdk
  // ****************************************************************************

  // sdk 设置消息为已读
  TriggerMessageReadTask({ commit }, message) {
    let msg = {
      MsgType: 'TriggerMessageReadTask',
      Content: {
        WxId: message.WxId,
        ConvId: message.Id // 会话的Id
      }
    }
    commit('SEND_SOCK', msg)
  },

  // server 获取公共话术 返回 GetCommonTermsResp
  GetCommonTerms({ rootGetters, commit }) {
    let uionId = Number(rootGetters.currentUser.UnionId)
    if (uionId) {
      let msg = {
        MsgType: 'GetCommonTerms',
        Content: { id: uionId, name: 'pc' }
      }
      commit('SEND_SOCK', msg)
    }
  },

  // ****************************************************************************
  // ****************************************************************************
  // ****************************************************************************
  // sdk 获取指定群聊的详情 返回1.群的信息ChatRoomAddNotice 返回2.群成员信息ChatRoomMembersNotice
  RequestChatRoomInfoTask({ commit }, message) {
    let msg = {
      MsgType: 'RequestChatRoomInfoTask',
      Content: {
        WeChatId: message.wechatId,
        ChatRoomId: message.friendId,
        Flag: 1 // Flag=1:推送成员信息（ChatRoomMembersNotice)
      }
    }
    commit('SEND_SOCK', msg)
  },

  // sdk 推送群聊列表 推送陌生人列表 返回ChatroomPushNotice和ChatRoomMembersNotice
  TriggerChatroomPushTask({ commit }, wechatId) {
    let msg = {
      MsgType: 'TriggerChatroomPushTask',
      Content: {
        WeChatId: wechatId, // 商家所属微信号
        Flag: 1 // Flag = 1:不推送成员信息（ChatRoomMembersNotice)
      }
    }
    commit('SEND_SOCK', msg)
  },

  // sdk 修改备注信息 返回TaskResultNotice
  ModifyFriendMemoTask({ commit, dispatch }, content) {
    content.TaskId = generateTaskId().toString()
    let msg = {
      MsgType: 'ModifyFriendMemoTask',
      Content: content
    }
    // 执行任务
    commit('SEND_SOCK', msg)
    // 操作保存本地nedb memoTask
    dispatch('nedb/AddMemoTask', content, { root: true })
  },

  // sdk 获取群二维码 返回PullChatRoomQrCodeTaskResultNotice
  PullChatRoomQrCodeTask({ commit }, message) {
    let msg = {
      MsgType: 'PullChatRoomQrCodeTask',
      Content: {
        WeChatId: message.WeChatId, // 商家所属微信号
        ChatRoomId: message.UserName, // 群聊id
        taskId: generateTaskId().toString()
      }
    }
    commit('SEND_SOCK', msg)
  },

  // sdk 添加群成员到通讯录 返回TaskResultNotice
  AddFriendInChatRoomTask({ commit, dispatch }, message) {
    let msg = {
      MsgType: 'AddFriendInChatRoomTask',
      Content: {
        WeChatId: message.WeChatId, // 商家个人微信内部全局唯一识别码
        ChatroomId: message.ChatroomId, // 所在的群聊id
        FriendId: message.FriendId, // 请求加好友微信内部全局唯一识别码
        Message: message.Message, // 招呼语
        Remark: message.Remark, // 备注信息
        TaskId: generateTaskId().toString() //任务Id
      }
    }
    commit('SEND_SOCK', msg)
    let doc = msg.Content
    // 操作保存本地nedb chatRoomTask
    dispatch('nedb/AddChatRoomTask', doc, { root: true })
  },

  // sdk 发红包 返回TaskResultNotice
  SendLuckyMoneyTask({ commit, dispatch }, message) {
    let sendTime = new Date().getTime()
    let taskId = sendTime * 10000 + Math.random() * 10000
    let content = {
      WeChatId: message.WeChatId, // 微信唯一Id
      FriendId: message.FriendId, // 聊天好友微信唯一id
      Money: message.Money, // 钱数，单位：分，最多20000
      Number: message.Number, // 红包个数，缺省1个
      Passwd: message.Passwd, // 密码，6位，纯数字
      Wish: message.Wish, // 祝福语
      TaskId: taskId // 任务id
    }
    let msg = {
      MsgType: 'SendLuckyMoneyTask',
      Content: content
    }
    // 执行任务
    commit('SEND_SOCK', msg)
    // 消息保存本地nedb chats
    let doc = {}
    // 按收到的红包格式创建一个本地消息
    let redContent = {
      Title: message.Wish,
      Key: '',
      InvalidTime: ''
    }
    // 发红包的自定义的字段
    redContent.Money = message.Money
    doc.Content = base64.encode(JSON.stringify(redContent))
    doc.ContentType = 'LuckyMoney'
    doc.FriendId = message.FriendId
    doc.WeChatId = message.WeChatId
    doc.MsgId = taskId.toString()
    // doc.msgSvrId = friendId
    doc.CreateTime = sendTime.toString()
    doc.IsSend = true

    // 插入luncMoney, 好友领红包的时候用到
    // doc.opened = 0
    // doc.InvalidTime = ''
    // doc.Key = ''
    // doc.Title = content.Wish
    // doc.SendId = ''
    //     this.$nedb.luckMoney.insert(
    //         doc,
    //         (err, newDoc) => { // Callback is optional
    //             if (err) return
    //         })
  },

  // sdk 转账 返回TaskResultNotice
  RemittanceTask({ commit, dispatch }, message) {
    let sendTime = new Date().getTime()
    let content = {
      WeChatId: message.WeChatId, // 微信唯一Id
      FriendId: message.FriendId, // 聊天好友微信唯一id
      Money: message.Money, // 钱数，单位：分
      Passwd: message.Passwd, // 密码，6位，纯数字
      Memo: message.Memo, // 留言
      TaskId: generateTaskId().toString() // 任务id
    }
    let msg = {
      MsgType: 'RemittanceTask',
      Content: content
    }
    // 执行任务
    commit('SEND_SOCK', msg)

    // 消息保存本地nedb chats
    let doc = {}
    // 按收到的红包格式创建一个本地消息
    let redContent = {
      Title: message.Memo,
      Feedesc: '￥' + message.Money / 100,
      Key: '',
      PaySubType: 1,
      InvalidTime: ''
    }
    // 转账的自定义的字段
    doc.Content = base64.encode(JSON.stringify(redContent))
    doc.ContentType = 'MoneyTrans'
    doc.FriendId = message.FriendId
    doc.WeChatId = message.WeChatId
    doc.MsgId = content.TaskId
    // doc.msgSvrId = friendId
    doc.CreateTime = sendTime.toString()
    doc.IsSend = true

    // 插入luncMoney, 好友领红包的时候用到
    // doc.opened = 0
    // doc.InvalidTime = ''
    // doc.Key = ''
    // doc.Title = content.Wish
    // doc.SendId = ''
    //     this.$nedb.luckMoney.insert(
    //         doc,
    //         (err, newDoc) => { // Callback is optional
    //             if (err) return
    //         })
  },

  // sdk 删除好友 返回FriendDelNotice
  DeleteFriendTask({ commit, dispatch }, message) {
    let content = {
      WeChatId: message.WeChatId, // 商家所属微信号
      FriendId: message.FriendId, // 要删除的微信号
      TaskId: generateTaskId().toString() //任务Id
    }
    let msg = {
      MsgType: 'DeleteFriendTask',
      Content: content
    }
    // 执行任务
    commit('SEND_SOCK', msg)
  },
  // sdk 同意加入群聊 返回TaskResultNotice
  AgreeJoinChatRoomTask({ commit, dispatch }, message) {
    let msg = {
      MsgType: 'AgreeJoinChatRoomTask',
      Content: {
        WeChatId: message.WeChatId, // 商家个人微信内部全局唯一识别码
        Talker: message.Talker, // 邀请者
        MsgSvrId: message.MsgSvrId, // 邀请消息的msgSvrId
        MsgContent: message.MsgContent, // 回传邀请信息的内容（json）
        taskId: generateTaskId().toString()
      }
    }
    // 执行任务
    commit('SEND_SOCK', msg)
  },

  // sdk 打开红包或转账 返回TakeMoneyTaskResultNotice
  TakeLuckyMoneyTask({ commit, dispatch }, message) {
    let msg = {
      MsgType: 'TakeLuckyMoneyTask',
      Content: {
        WeChatId: message.WeChatId, //微信唯一Id
        FriendId: message.FriendId, //聊天好友微信唯一id
        MsgSvrId: message.MsgSvrId, //全局消息id
        MsgKey: message.MsgKey, // 消息内容中的Key
        TaskId: generateTaskId().toString() //
      }
    }
    // 执行任务
    commit('SEND_SOCK', msg)
    // 添加到数据库
    let doc = {}
    for (const key in msg.Content) {
      if (msg.Content.hasOwnProperty(key)) {
        doc[key] = msg.Content[key]
      }
    }
    dispatch('nedb/InsertLuckMoney', doc, { root: true })
  },

  // sdk 查询红包 返回QueryHbDetailTaskResultNotice
  QueryHbDetailTask({ commit, dispatch }, message) {
    let msg = {
      MsgType: 'QueryHbDetailTask',
      Content: {
        WeChatId: message.WeChatId, // 所属微信号
        HbUrl: message.HbUrl // 红包key
      }
    }
    // 执行任务
    commit('SEND_SOCK', msg)
    // 添加到数据库
    // let doc = {}
    // for (const key in msg.Content) {
    //     if (msg.Content.hasOwnProperty(key)) {
    //         doc[key] = msg.Content[key]
    //     }
    // }
    // dispatch('nedb/InsertLuckMoney', doc, { root: true })
  },

  // sdk 推送公共号列表 返回BizContactPushNotice
  TriggerBizContactPushTask({ commit, rootGetters }) {
    let msg = {
      MsgType: 'TriggerBizContactPushTask',
      Content: {
        WeChatId: rootGetters['conversation/currentWeChatId'] //微信唯一Id
      }
    }
    commit('SEND_SOCK', msg)
  }
}

// mutations
const mutations = {
  // 发送消息
  SEND_SOCK(state, agentData) {
    sendSock(agentData)
  },
  // 设置登陆页面的loading
  SET_LOGIN_LOADING(state, flag) {
    state.loginLoading = flag
  }
}

export default {
  namespaced: true,
  state,
  getters,
  actions,
  mutations
}
