import { getToken } from '@/utils/auth'
import store from '../store'
import { Message } from 'element-ui'
// let server = "wss://hhomc.hz-hanghui.com:18096/websocket?token=" + getToken();
const server = window.g.wsPath + getToken() + '&source=TQ'
export let ws = {}
let lockReconnect = false // 避免ws重复连接
let count = 0 // 记录计数
// 监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
window.onbeforeunload = function() {
  ws.close()
}
// 重连
const reconnect = (server) => {
  if (count >= 10) return console.log('超出重连次数！')
  if (lockReconnect) return false
  lockReconnect = true
  setTimeout(function() {
    // 没连接上会一直重连，设置延迟避免请求过多
    createWebSocket(server)
    lockReconnect = false
    count++
  }, 10 * 1000)
}
// 创建实例websocket
const createWebSocket = (server) => {
  try {
    if ('WebSocket' in window) {
      ws = new WebSocket(server)
    } else if ('MozWebSocket' in window) {
      ws = new MozWebSocket(server)
    } else {
      Message({ message: '当前浏览器不支持websocket协议,建议使用现代浏览器', type: 'warning' })
    }
    // 连接建立时触发
    init()
  } catch (e) {
    console.log('ERR-----------捕获异常', e)
  }
}
// init函数可在页面加载的时候就进行初始化或者根据自己的业务需求在需要打开通讯的时候在进行初始化
export function init() {
  // 实例化socket，这里的实例化直接赋值给ws是为了后面可以在其它的函数中也能调用websocket方法，例如：ws.close(); 完成通信后关闭WebSocket连接
  ws = new WebSocket(server)
  // 监听并处理error事件
  ws.onerror = function(error) {
    console.log('error', error)
    reconnect(server)
  }
  // 监听连接关闭事件
  ws.onclose = () => {
    // 监听整个过程中websocket的状态
    console.log('ws连接状态：' + ws.readyState)
    reconnect(server)
  }
  // 监听是否连接成功
  ws.onopen = () => {
    console.log('ws连接状态：' + ws.readyState)
    heartCheck.reset().start() // 心跳检测重置
    // count = 0; // 重置重连次数
    // 连接成功则发送一个数据
    // ws.send("连接成功");
  }

  // 接听服务器发回的信息并处理展示
  ws.onmessage = (evt) => {
    console.log('接收到来自服务器的消息：')
    // console.log(evt.data);
    heartCheck.reset().start()// 拿到任何消息都说明当前连接是正常的
    let eventData
    // try {
    if (evt.data.indexOf('sn') > -1) {
      eventData = JSON.parse(evt.data)
      console.log(eventData)
      store.dispatch('user/getWebSocket', eventData)
    }
    // } catch (e) {
    //   console.log("捕获异常: 当前返回的数据不能解析;");
    //   console.log("内容：" + evt.data);
    // }
  }
}
// 心跳检测
const heartCheck = {
  timeout: 25000, // 设置心跳时间
  timeoutObj: null,
  serverTimeoutObj: null,
  reset: function() {
    clearTimeout(this.timeoutObj)
    clearTimeout(this.serverTimeoutObj)
    return this
  },
  start: function() {
    const self = this
    this.timeoutObj = setTimeout(function() {
      // 这里发送一个心跳，后端收到后，返回一个心跳消息，onmessage拿到返回的心跳就说明连接正常
      ws.send('ping--------------Ping')
      self.serverTimeoutObj = setTimeout(function() {
        // 如果超过一定时间还没重置，说明后端主动断开了
        // 如果onclose会执行reconnect，我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
        ws.close()
      }, self.timeout)
    }, this.timeout)
  }
}
