/**
 * Chat
 * 
 */
// var config = require('/config.js');
import { login } from '../pages/login/login'
const config = require('../config/config.js');

const app = new getApp();

export default class Chat {

  constructor(app) {
    this.chat_id = null // chat_id
    this.connectStatus = 0 // websocket 连接状态 0：未连接，1：已连接
    this.heartListen = null // 心跳
    this.watcherList = [] // 订阅者
    this.app = app // 方便在Chat内部操作app
  }

  /* 初始化连接 */
  connectSocket() {
    let type = app.globalData.SystemInfo.model === 'microsoft' ? 'wx' : 'phone';
    const openId = app.globalData.open_id;
    //被踢掉后 openId被清空，此时不需要再进行连接
    if (openId == null || openId == '' || openId == undefined){
      return;
    }
    const url = `${config.ws_url}:${config.ws_port}/websocket/wechat/${openId}-${type}`
 
    this.chat_id = new Date().getTime()
    // websocket连接
    wx.connectSocket({
      url: url,
      header: {
        'content-type': 'application/json'
      },
      method: 'post',
      success: res => {
        // 设置连接状态
        this.connectStatus = 1
        // 心跳
        clearInterval(this.heartListen)
        this.heartListen = setInterval(() => {
          if (this.connectStatus === 0) { 
            clearInterval(this.heartListen)
            this.reconnect()
          } else { 
          }
        }, 500)
        app.globalData.wsId = this.heartListen;
      },
      fail: err => {
        console.error('连接失败')
      }
    })
    // 监听webSocket错误
    wx.onSocketError(res => {
      // 修改连接状态
      this.connectStatus = 0
    })
    // 监听WebSocket关闭
    wx.onSocketClose(res => {
      this.connectStatus = 0
    })
    // websocket打开
    wx.onSocketOpen(res => {
    })
    // 收到websocket消息
    wx.onSocketMessage(res => {
       res = JSON.parse(res.data);
      if (res.code === 'logout'){
        app.globalData.user = null;
        app.globalData.customerInfo = null;
        wx.showModal({
          title: '安全提示',
          content: '您的账号在另一台设备上登录，您将被迫下线。如非本人操作，您的密码很有可能已经泄露，请及时修改密码',
          showCancel:false,
          confirmText:'确定',
          success(res) {
            wx.reLaunch({
              url: '/pages/login/login',
            }) 
          }
        })
      }
      if (res.code === 'unbind_by_admin'){ 
        app.globalData.user = null;
        app.globalData.customerInfo = null;
        wx.showModal({
          title: '退出提示',
          content: '您的账号已被管理员解绑，您将被迫退出系统。如有问题，请联系管理员',
          showCancel: false,
          confirmText: '确定',
          success(res) {
            wx.reLaunch({
              url: '/pages/login/login',
            })
          }
        })
      }
    })

  }

  /* 重连 */
  reconnect() { 
    // wx.closeSocket() // 重连之前手动关闭一次
    this.connectSocket()
  }

  /* 关闭websocket */
  closeSocket(removeChat) {
    wx.closeSocket({
      success: res => { 
        clearInterval(app.globalData.wsId);
        // code
      }
    })
  }

  /* 添加watcher */
  addWatcher(fn) {
    this.watcherList.push(fn)
    return this.watcherList.length - 1 // 返回添加位置的下标，Page unload的时候方便删除List成员
  }

  /* 删除watcher */
  delWatcher(index) {
    this.watcherList.splice(index, 1) 
  }

  /* 收到消息 */
  getSocketMsg(data) { 
    if (data.code === 5100) { // 处理登录过期
      login()
        .then(res => { 
          // 重新登录成功，发起重连
          this.reconnect()
        })
        .catch(err => {
          console.error('登录失败', err)
        })
      // 正确状态
    } else if (data.code === 0) {
      // 给每个订阅者发消息
      const list = this.watcherList
      for (let i = 0; i < list.length; i++) {
        list[i](data)
      }
      // 其他返回类型
    } else {
      // balabalabala
    }
  }

  // 这里可以写一些方法，如发送消息等
  // code

}