export let wsUri = "ws://192.168.31.152:20000?token=cnVpbXM6MTIzNDU2"
const logTag = "wsMgr"
let ws = null
// WebSocket.readyState;
// 0 (WebSocket.CONNECTING)
// 正在链接中
// 1 (WebSocket.OPEN)
// 已经链接并且可以通讯
// 2 (WebSocket.CLOSING)
// 连接正在关闭
// 3 (WebSocket.CLOSED)
// 连接已关闭或者没有链接成功

let pingTimerId = null
let pongTimerId = null
const PING_INTERVAL = 15 * 1000
const ON_PING_INTERVAL = 15 * 1000

let needRec = false
const REC_INTERVAL = 15 * 1000

import Vue from 'vue'
export const EVENT_SET_CUR_DOT = 'eventSetCurrentDot'
export const EVENT_WELL_WARN = 'oneWellWarningArrived'
export const EVENT_ALL_WARN = 'allWellWarningsReceived'
export const EVENT_SET_RIGHT_tOP_DOT = 'eventSetRightTopDot'


setInterval(() => {
  if (needRec) {
    console.log(logTag + "===try rec===")
    init()
  }
}, REC_INTERVAL)

export function initWithUrl (url) {
  wsUri = url
  init()
}

function init () {

  resetWs()
  if (wsUri === null || wsUri === '') {
    console.log(logTag + "===init=== set wsURI first")
    return
  }
  console.log(logTag + "===init===  wsURI：" + wsUri)

  ws = new WebSocket(wsUri)
  ws.onopen = mevt => {
    console.log(logTag + "===onopen===")
    console.log(mevt)
    console.log(ws)
    needRec = false
    initHeartBeat()
  }
  ws.onmessage = mevt => {
    if (mevt.data === "pong") {
      initHeartBeat()
    } else {
      dispatchMsg(mevt.data)
    }
  }
  ws.onclose = mevt => {
    console.log(logTag + "===onclose=== code:" + mevt.code)
    stopHeartBeat()
    if (mevt.code !== 1000) {
      needRec = true
    }
    // 0–999	 	保留段, 未使用.
    // 1000	CLOSE_NORMAL	正常关闭; 无论为何目的而创建, 该链接都已成功完成任务.
    // 1001	CLOSE_GOING_AWAY	终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开.
    // 1002	CLOSE_PROTOCOL_ERROR	由于协议错误而中断连接.
    // 1003	CLOSE_UNSUPPORTED	由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收到了二进制数据).
    // 1004	 	保留. 其意义可能会在未来定义.
    // 1005	CLOSE_NO_STATUS	保留. 表示没有收到预期的状态码.
    // 1006	CLOSE_ABNORMAL	保留. 用于期望收到状态码时连接非正常关闭 (也就是说, 没有发送关闭帧).
    // 1007	Unsupported Data	由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据).
    // 1008	Policy Violation	由于收到不符合约定的数据而断开连接. 这是一个通用状态码, 用于不适合使用 1003 和 1009 状态码的场景.
    // 1009	CLOSE_TOO_LARGE	由于收到过大的数据帧而断开连接.
    // 1010	Missing Extension	客户端期望服务器商定一个或多个拓展, 但服务器没有处理, 因此客户端断开连接.
    // 1011	Internal Error	客户端由于遇到没有预料的情况阻止其完成请求, 因此服务端断开连接.
    // 1012	Service Restart	服务器由于重启而断开连接. [Ref]
    // 1013	Try Again Later	服务器由于临时原因断开连接, 如服务器过载因此断开一部分客户端连接. [Ref]
    // 1014	 	由 WebSocket 标准保留以便未来使用.
    // 1015	TLS Handshake	保留. 表示连接由于无法完成 TLS 握手而关闭 (例如无法验证服务器证书).
    // 1016–1999	 	由 WebSocket 标准保留以便未来使用.
    // 2000–2999	 	由 WebSocket 拓展保留使用.
    // 3000–3999	 	可以由库或框架使用. 不应由应用使用. 可以在 IANA 注册, 先到先得.
    // 4000–4999	 	可以由应用使用.
  }
}

export function resetWs () {
  if (ws != null) {
    ws.close(1000)
    ws = null
  }
  stopHeartBeat()
}

function dispatchMsg (msg) {
  let obj = JSON.parse(msg)
  console.log('看看这是啥？',obj)
  if (obj.type === 3) {
    Vue.bus.emit(EVENT_SET_CUR_DOT, obj.data)
  } else if (obj.type === 4) { // 单井预警
    Vue.bus.emit(EVENT_WELL_WARN, obj.data)
  } else if (obj.type === 5) { // 所有井最新预警
    Vue.bus.emit(EVENT_ALL_WARN, obj.data)
  }else if(obj.type === 99){
    Vue.bus.emit(EVENT_SET_RIGHT_tOP_DOT, obj.data)
  }
}

export function sendMsg (txt) {
  if (ws != null) {
    ws.send(txt)
    console.log(logTag + "===sendMsg11===：" + txt)
    Vue.bus.emit(EVENT_SET_CUR_DOT, {})
  } else {
    console.log(logTag + "ws is null")
  }
}

function startHeartBeat (onPing, onPongTimeOut) {
  stopHeartBeat()
  pingTimerId = setTimeout(() => {
    onPing()
    pongTimerId = setTimeout(() => {
      onPongTimeOut()
    }, ON_PING_INTERVAL)
  }, PING_INTERVAL)
}

function stopHeartBeat () {
  if (pingTimerId != null) {
    clearTimeout(pingTimerId)
    pingTimerId = null
  }
  if (pongTimerId != null) {
    clearTimeout(pongTimerId)
    pongTimerId = null
  }
}

function initHeartBeat () {
  startHeartBeat(
    () => {
      sendMsg("ping")
    },
    () => {
      needRec = true
    }
  )
}
