/**
 * GsWebSocket to do Ghostream signalling
 */
export class GsWebSocket {
    constructor() {
        const protocol = (window.location.protocol === "https:") ? "wss://" : "ws://";
        this.url = protocol + window.location.host + "/_ws/";

        // Open WebSocket
        this._open();

        // Configure events
        this.socket.addEventListener("open", () => {
            console.log("[WebSocket] Connection established");
        });
        this.socket.addEventListener("close", () => {
            console.log("[WebSocket] Connection closed, retrying connection in 1s...");
            setTimeout(() => this._open(), 1000);
        });
        this.socket.addEventListener("error", () => {
            console.log("[WebSocket] Connection errored, retrying connection in 1s...");
            setTimeout(() => this._open(), 1000);
        });
    }

    _open() {
        console.log(`[WebSocket] Connecting to ${this.url}...`);
        this.socket = new WebSocket(this.url);
    }

    /**
     * Send local WebRTC session description to remote.
     * @param {SessionDescription} localDescription WebRTC local SDP
     * @param {string} stream Name of the stream
     * @param {string} quality Requested quality 
     */
    sendLocalDescription(localDescription, stream, quality) {
        if (this.socket.readyState !== 1) {
            console.log("[WebSocket] Waiting for connection to send data...");
            setTimeout(() => this.sendLocalDescription(localDescription, stream, quality), 100);
            return;
        }
        console.log(`[WebSocket] Sending WebRTC local session description for stream ${stream} quality ${quality}`);
        this.socket.send(JSON.stringify({
            "webRtcSdp": localDescription,
            "stream": stream,
            "quality": quality
        }));
    }

    /**
     * Set callback function on new remote session description.
     * @param {Function} callback Function called when data is received
     */
    onRemoteDescription(callback) {
        this.socket.addEventListener("message", (event) => {
            console.log("[WebSocket] Received WebRTC remote session description");
            const sdp = new RTCSessionDescription(JSON.parse(event.data));
            callback(sdp);
        });
    }
}