import { ElMessage } from "element-plus";
import { useUserStore } from "../store/modules/user";
let HeartbeatTime: any = null;
let websocket: WebSocket | null = null; // 用于存储实例化后websocket
let rec: any; // 断线重连后，延迟5秒重新创建WebSocket连接  rec用来存储延迟请求的代码
// 创建websocket
let wsUrl: any = "";
let callBack: any = null;
const connectMsg = (fun: Function) => {
  callBack = fun;
  const useUser = useUserStore();
  wsUrl = `${import.meta.env.VITE_USER_APP_WS_API_URL}?type=yk&code=${
    useUser.chatInfo.clientId
  }&kf=${useUser.chatInfo.serviceId}`;
  console.log("建立连接地址:" + wsUrl);
  initWebSocket(wsUrl);
};
function creatWebSocket(wsUrl: string) {
  // 判断当前浏览器是否支持WebSocket
  if ("WebSocket" in window) {
    console.log("当前浏览器支持 WebSocket");
  } else if ("MozWebSocket" in window) {
    console.log("当前浏览器支持 MozWebSocket");
  } else {
    console.log("当前浏览器不支持 WebSocket");
  }
  try {
    initWebSocket(wsUrl); // 初始化websocket连接
  } catch (e) {
    console.log("尝试创建连接失败");
    reConnect(wsUrl); // 如果无法连接上 webSocket 那么重新连接！可能会因为服务器重新部署，或者短暂断网等导致无法创建连接
  }
}

// 初始化websocket
function initWebSocket(wsUrl: string) {
  if (!websocket) websocket = new WebSocket(wsUrl);
  websocket.onopen = function (eee) {
    websocketOpen();
  };
  //   // 接收
  websocket.onmessage = function (e: MessageEvent<any>) {
    websocketonmessage(e);
  };
  // 连接发生错误
  websocket.onerror = function () {
    //     isConnect = false; // 连接断开修改标识
    reConnect(wsUrl); // 连接错误 需要重连
  };
  websocket.onclose = function (e) {
    websocketclose(e);
  };
}
//调取心跳
function websocketHeartbeat() {
  clearInterval(HeartbeatTime);
  HeartbeatTime = setInterval(() => {
    websocketsend({
      cmd: 13,
    });
  }, 10000);
}
// 定义重连函数
const reConnect = (wsUrl: string) => {
  if (useUserStore().isConnected) return; // 如果已经连上就不在重连了
  rec && clearTimeout(rec);
  rec = setTimeout(function () {
    // 延迟5秒重连  避免过多次过频繁请求重连
    creatWebSocket(wsUrl);
  }, 5000);
};

// 创建连接
function websocketOpen() {
  useUserStore().connect();
  websocketHeartbeat();
}
// 数据接收
function websocketonmessage(e: MessageEvent<any>) {
  const res = JSON.parse(e.data); // 解析JSON格式的数据
  console.log(res, "接收数据");
  if (res.command == 11) {
    //将数据放在store中
    // 下面的判断则是后台返回的接收到的数据  如何处理自己决定
    setTimeout(() => {
      callBack();
      // useUserStore().setUserListMessages(res.data).then();
    }, 10);
  }
}

// 关闭
function websocketclose(e: any) {
  console.log("连接关闭");
  clearInterval(HeartbeatTime);
  useUserStore().disconnect(); // 修改连接状态
  connectMsg(callBack)

}

// 数据发送
function websocketsend(res: any) {
  if (websocket && useUserStore().isConnected) {
    // 检查连接状态
    websocket.send(JSON.stringify(res));
  } else {
    ElMessage({
      showClose: true,
      message: "请选择设备连接",
      type: "error",
    });
  }
}

// 实际调用的方法==============

// 发送
function sendWebSocket(data: any) {
  // 如果未保持连接状态 不允许直接发送消息 提示请选择连接设备
  if (!useUserStore().isConnected) {
    ElMessage({
      showClose: true,
      message: "请选择设备连接",
      type: "error",
    });
    // websocketsend(data);
  } else {
    console.log("发送时的数据，方便调试", {
      data,
      url:wsUrl
    });

    websocketsend(data);
    console.log("------------------");
  }
}

// 关闭
const closeWebSocket = () => {
  if (websocket) {
    websocket.close();
    ElMessage({
      showClose: true,
      message: "设备已关闭",
      type: "success",
    });
  }
};

export {
  connectMsg,
  initWebSocket,
  sendWebSocket,
  creatWebSocket,
  closeWebSocket,
};
