import { IWuJieInterface } from "./../store/index";
import { store } from "quasar/wrappers";

export default class WuJieReconnectingWebSocket {
  readyState: number;
  $wujie: IWuJieInterface;

  constructor() {
    this.readyState = WebSocket.OPEN;
    this.onclose = (ev: any) => {};
    this.onerror = (ev: any) => {};
    this.onmessage = (ev: any) => {};
    this.onopen = (ev: any) => {};

    this.$wujie = (window as any).$wujie;
    if (this.$wujie) {
      this.$wujie.bus.$on("onclose", this.onclose);
      this.$wujie.bus.$on("onerror", this.onerror);
      this.$wujie.bus.$on("onmessage", (ev: any) => {
        if (this.onmessage) {
          this.onmessage(ev);
        }
      });
      this.$wujie.bus.$on("onopen", this.onopen);
      setTimeout(() => {
        if (this.onopen) {
          this.onopen(null);
        }
      }, 500);
    }
  }
  onclose: ((event: any) => void) | null;
  /**
   * An event listener to be called when an error occurs
   */
  onerror: ((event: any) => void) | null;
  /**
   * An event listener to be called when a message is received from the server
   */
  onmessage: ((event: MessageEvent) => void) | null;
  /**
   * An event listener to be called when the WebSocket connection's readyState changes to OPEN;
   * this indicates that the connection is ready to send and receive data
   */
  onopen: ((event: any) => void) | null;
  /**
   * Closes the WebSocket connection or connection attempt, if any. If the connection is already
   * CLOSED, this method does nothing
   */
  close(code?: number, reason?: string) {}
  /**
   * Enqueue specified data to be transmitted to the server over the WebSocket connection
   */
  send(data: string) {
    if (this.$wujie) {
      this.$wujie.bus.$emit("send_to", data);
    }
  }
}
