
import { getStats } from './api.js';

class WebSocketChannel {
  constructor(){
    this.wsUrl = window.location.protocol.replace("http", "ws") +
      "//" + window.location.host +
      window.location.pathname.substring(0, window.location.pathname.lastIndexOf("/")) +
      "/api/ws";

    this.listenerMap = {/* type -> [listeners] */};
  }

  addListener(type, listener){
    var list = this.listenerMap[type];
    if (!list){
      list = [];
      this.listenerMap[type] = list;
    }

    list.push(listener);
  }

  removeListener(type, listener){
    var list = this.listenerMap[type];
    if (!list){
      return;
    }

    this.listenerMap[type] = list.filter(l => l != listener);
  }

  connect(){
    var ws = new WebSocket(this.wsUrl);
    var self = this;

    ws.onmessage = function(e){
      var event = JSON.parse(e.data);
      //rendered-tile, mapobject-created, mapobjects-cleared

      var listeners = self.listenerMap[event.type];
      if (listeners){
        listeners.forEach(function(listener){
          listener(event.data);
        });
      }
    };

		function fallbackPolling(){
			getStats()
			.then(function(stats){
				if (!stats){
					// no stats (yet)
					return;
				}

				var listeners = self.listenerMap["minetest-info"];
				if (listeners){
					listeners.forEach(function(listener){
						listener(stats);
					});
				}
			});
		}

    ws.onerror = function(){
      //fallback to polling stats
      setInterval(fallbackPolling, 2000);
    };
  }
}

export default new WebSocketChannel();
