import {EventSourcePolyfill} from "event-source-polyfill";
import {isBlank} from "./index";
import store from "@/store";
import { getToken } from '@/utils/auth'

export async function  createSSE(_this){
  setTimeout(()=>{
    if(window.EventSource) {
      // 根据环境的不同，变更url 项目请求路径
      const url = process.env.VUE_APP_BASE_API
      // 用户userId 用于设置连接的唯一连接标识id
      let  userId  = _this.$store.state.user.userInfo.userId
      if(isBlank(userId))return;
      // 这里的连接Id的设置采用的是用户id+时间戳的格式,使连接始终保持唯一,避免连接重复导致的冲突,
      let clientId = userId+"_"+new Date().getTime()
      // 将连接id保存在缓存中,其他地方用得到
      _this.$store.commit('SET_MESSAGE_CLIENT_ID', clientId);
      // 创建连接,调用服务端创建连接的接口,添加对应的参数,
      _this.eventSource = new EventSourcePolyfill(
        `${url}/sse/createConnect?clientId=${clientId}`, {
          // 设置重连时间
          heartbeatTimeout: 60*60*24*1000,
          // 添加token
          headers: {
            'Authorization': `Bearer `+getToken(),
          },
        });
      // 创建连接成功回调的函数,可进行对应的业务操作
      _this.eventSource.onopen = (e) => {
        // console.log("已建立SSE连接~")
      }

      // 接收到服务端发来的消息时回调的函数,可进行对应的业务操作
      _this.eventSource.onmessage = (e) => {

        let resData = JSON.parse(e.data)
        // console.log("转JSON后的对象",resData)
        // 将消息内容保存在缓存里面,在消息图标的地方可以获取到
        store.dispatch('loadingSSEMessage',resData);
        // console.log("已接受到消息:", e.data)
      }

      // 连接发生错误时回到的函数,会自动进行重连操作可进行对应的业务操作
      _this.eventSource.onerror = (e) => {
        if (e.readyState == EventSource.CLOSED) {
          console.log("SSE连接关闭");
          // _this.eventSource.close();
        } else if (_this.eventSource.readyState == EventSource.CONNECTING) {
          console.log("SSE正在重连");
          // _this.eventSource.close();
          //重新设置token
          _this.eventSource.headers = {
            'Authorization': `Bearer `+getToken()
          };
        } else {
          console.log('error', e);
        }
      };
    } else {
      console.log("你的浏览器不支持SSE~")
    }

  },500)

}





export async function  createChatSSE(_this){
  setTimeout(()=>{
    if(window.EventSource) {
      // 根据环境的不同，变更url 项目请求路径
      const url = process.env.VUE_APP_BASE_API
      // 用户userId 用于设置连接的唯一连接标识id
      let  userId  = _this.$store.state.user.userInfo.userId
      if(isBlank(userId))return;
      // 这里的连接Id的设置采用的是用户id_chat_+时间戳的格式,使连接始终保持唯一,避免连接重复导致的冲突,
      let clientId = userId+"_chat"+"_"+new Date().getTime()
      // 将连接id保存在缓存中,其他地方用得到
      _this.$store.commit('SET_SSECHATMESSAGE_CLIENT_ID', clientId);
      // 创建连接,调用服务端创建连接的接口,添加对应的参数,
      _this.eventSource = new EventSourcePolyfill(
        `${url}/sse/createChatRoomConnect?clientId=${clientId}`, {
          // 设置重连时间
          heartbeatTimeout: 60*60*24*1000,
          // 添加token
          headers: {
            'Authorization': `Bearer `+getToken(),
          },
        });
      // 创建连接成功回调的函数,可进行对应的业务操作
      _this.eventSource.onopen = (e) => {
        // console.log("已建立聊天室SSE连接~")
      }

      // 接收到服务端发来的消息时回调的函数,可进行对应的业务操作
      _this.eventSource.onmessage = (e) => {

        let resData = JSON.parse(e.data)
        console.log("转JSON后的SSEChat 对象",resData)
        // 将消息内容保存在缓存里面,在消息图标的地方可以获取到
        store.dispatch('loadingSSEChatMessage',resData);
        // console.log("已接受到消息:", e.data)
      }

      // 连接发生错误时回到的函数,会自动进行重连操作可进行对应的业务操作
      _this.eventSource.onerror = (e) => {
        if (e.readyState == EventSource.CLOSED) {
          // console.log("SSE连接关闭");
          // _this.eventSource.close();
        } else if (_this.eventSource.readyState == EventSource.CONNECTING) {
          // console.log("SSE正在重连");
          // _this.eventSource.close();
          //重新设置token
          _this.eventSource.headers = {
            'Authorization': `Bearer `+getToken()
          };
        } else {
          // console.log('error', e);
        }
      };
    } else {
      console.log("你的浏览器不支持SSE~")
    }

  },500)
}
