/**
 * FIXME 环境配置
 *
 * window.wsUrl
 * - 线上环境：'wss://epp.only4.work/access/websocket/'
 * - 开发环境：'ws://127.0.0.1:80/access/websocket/'
 *            'ws://127.0.0.1:8002/access/websocket/'
 */
window.wsUrl = 'ws://127.0.0.1:80/access/websocket/';

window.ws = null; // WebSocket 实例对象

(function () {
    if (!'WebSocket' in window) {
        alert("不支持当前浏览器，请升级浏览器。")
        return
    }

    function getWsUrl() {
        function getUUID() {
            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
                return v.toString(16);
            });
        }

        return `${window.wsUrl}${getUUID()}`
    }

    function createConn() {
        // 创建webscoket 对象
        const ws = new WebSocket(getWsUrl() /* window.wsUrl */)
        // 执行上面的语句之后，客户端就会与服务器进行连接

        // readyState返回当前实例对象的当前状态
        /*
          共有四种状态
          CONNECTING: 值为0，表示正在连接
          OPEN:  值为1，表示连接成功，可以通信了
          CLOSING 值为2， 表示连接正在关闭
          CLOSED 值为3，表示连接已经关闭了，或者打开连接失败
        */

        // 实例对象的onopen属性，用于指定连接成功后的回调函数
        ws.onopen = (res) => {
            console.log('onopen readyState', ws.readyState)
            console.log('onopen 连接成功==========>', res)
        }

        // 实例对象的onmessage属性，用于指定收到服务器数据后的回调函数
        ws.onmessage = ({data}) => {
            console.log('onmessage readyState', ws.readyState)
            // 注意此时的data是json格式的 需要转化下
            let result = JSON.parse(data)
            console.log('onmessage 有新消息啦=======>', result)
            // 实例对象的send方法给服务器发送消息
            ws.send('客户端发送的消息')

            switch (result.action) {
                case 'onscan':
                case 'onopen':
                    if (window.currentGate && result.gateId === window.currentGate.id) {
                        console.log(result.action)
                        window.showResult(result.action)
                    }
                    break;
                default:
                    console.log("switch=>default", result.action)
                    break;
            }
        }

        // 实例对象的onclose属性，用于连接关闭后的回调 函数
        // 当关闭了服务器后 会走到此回调函数
        ws.onclose = () => {
            console.log('onclose readyState', ws.readyState)
            console.log('onclose websocket连接关闭=======>')
            console.log("等待 1s 尝试重新建立连接...");
            setTimeout(function () {
                window.ws = createConn();
            }, 1000);
        }

        // 连接发生错误的回调方法
        // 如当服务器没有启动 就会走到这个错误回调
        ws.onerror = (error) => {
            console.log('onerror readyState', ws.readyState)
            console.log('onerror 发生错误==========>', error)
        }
        return ws
    }

    window.ws = createConn()
})()
