class WebsocketUtil {
  constructor(url, time) {
    this.is_open_socket = false; // 避免重复连接
    this.url = url; // 地址
    this.data = null;
    // 心跳检测
    this.timeout = time; // 多少秒执行检测
    this.heartbeatInterval = null; // 检测服务器端是否还活着
    this.reconnectInterval = null; // 重连之后多久再次重连
    this.messageCallbacks = []; // 存储消息回调函数
    this.store = null; // 存储Vuex store引用

    try {
      return this.connectSocketInit();
    } catch (e) {
      this.is_open_socket = false;
    }
  }

  // 设置store
  setStore(store) {
    this.store = store;
  }

  // 创建WebSocket连接
  connectSocketInit() {
    if (this.is_open_socket) return;

    this.socketTask = uni.connectSocket({
      url: this.url,
      success: () => {
        this.is_open_socket = true;
        return this.socketTask;
      },
    });

    this.socketTask.onOpen((res) => {
      clearInterval(this.reconnectInterval);
      clearInterval(this.heartbeatInterval);
      this.is_open_socket = true;
      this.start();

      this.socketTask.onMessage((res) => {
        try {
          const data = JSON.parse(res.data);
          // 如果有store，将数据存入store
          if (this.store) {
            this.store.commit("setWebSocketData", data);
          }
          // 执行所有注册的回调函数
          this.messageCallbacks.forEach((callback) => callback(data));
        } catch (e) {
          console.error("WebSocket消息解析错误:", e);
        }
      });
    });

    this.socketTask.onError((res) => {
      this.is_open_socket = false;
      if (this.socketTask) {
        this.socketTask.close();
      }
    });

    this.socketTask.onClose(() => {
      this.is_open_socket = false;
    });
  }

  // 发送消息
  send(value) {
    if (!this.is_open_socket) return;

    this.socketTask.send({
      data: JSON.stringify(value),
      success() {
        console.log("消息发送成功", value);
      },
      fail(err) {
        console.error("消息发送失败", err);
      },
    });
  }

  // 关闭连接
  close() {
    clearInterval(this.heartbeatInterval);
    clearInterval(this.reconnectInterval);
    this.is_open_socket = false;
    if (this.socketTask) {
      this.socketTask.close();
    }
  }

  // 开启心跳检测
  start() {
    // this.heartbeatInterval = setInterval(() => {
    //   const heartbeatMsg = {
    //     type: 'heartbeat',
    //     userId: uni.getStorageSync('userinfo')?.user_id
    //   }
    //   this.send(heartbeatMsg)
    // }, this.timeout)
  }

  // 重新连接
  reconnect() {
    clearInterval(this.heartbeatInterval);
    if (!this.is_open_socket) {
      this.reconnectInterval = setInterval(() => {
        this.connectSocketInit();
      }, 3000);
    }
  }

  // 注册消息回调
  onMessage(callback) {
    this.messageCallbacks.push(callback);
  }

  // 移除消息回调
  offMessage(callback) {
    this.messageCallbacks = this.messageCallbacks.filter(
      (cb) => cb !== callback
    );
  }
}

class WebSocketManager {
  constructor() {
    this.connections = {}; // 存储所有WebSocket连接
    this.globalConnections = []; // 存储需要全局管理的连接名称
  }

  // 创建全局连接
  createGlobalConnection(name, url, time, store) {
    if (!this.connections[name]) {
      this.connections[name] = new WebsocketUtil(url, time);
      if (store) this.connections[name].setStore(store);
      this.globalConnections.push(name);
    }
    return this.connections[name];
  }

  // 创建页面级连接
  createPageConnection(name, url, time) {
    if (!this.connections[name]) {
      this.connections[name] = new WebsocketUtil(url, time);
    }
    return this.connections[name];
  }

  // 获取连接
  getConnection(name) {
    return this.connections[name];
  }

  // 关闭指定连接
  closeConnection(name) {
    console.log("关闭指定连接", name);
    if (this.connections[name]) {
      this.connections[name].close();
      delete this.connections[name];

      // 从全局连接列表中移除
      this.globalConnections = this.globalConnections.filter((n) => n !== name);
    }
  }

  // 关闭所有全局连接
  closeAllGlobalConnections() {
    this.globalConnections.forEach((name) => {
      this.closeConnection(name);
    });
  }

  // 关闭所有连接
  closeAllConnections() {
    Object.keys(this.connections).forEach((name) => {
      this.connections[name].close();
    });
    this.connections = {};
    this.globalConnections = [];
  }
}

// 导出单例实例
export const webSocketManager = new WebSocketManager();
export default WebsocketUtil;
