"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var WebsocketService =
/*#__PURE__*/
function () {
  function WebsocketService() {
    _classCallCheck(this, WebsocketService);

    //let hostname = window.location.hostname;
    var hostname = "placeit-scan.kippdata.de"; //TODO: Hostname should come from configuration file.

    var port = "8043";
    var service = "endpoint-service/counts";
    this._hostname = hostname;
    this._port = port;
    this._service = service;
    this._isOpen = false;
    this._items = new Set(); // list of registered items

    this._itemData = new Map(); // map with id as key and data as value
  }

  _createClass(WebsocketService, [{
    key: "register",
    value: function register(itemId) {
      console.info("[register]: Registering " + itemId);
      var items = this._items;
      if (items.size == 0) this.createWebsocket(this._hostname, this._port, this._service, itemId);

      if (!items.has(itemId)) {
        console.info("[register]: Registered new id " + itemId);
        items.add(itemId);
        var ws = this._ws;

        try {
          ws.send(itemId); // currently only the raw id will be sent
        } catch (error) {
          console.warn("Warning: Could not send data over the websocket");
        }
      }
    }
  }, {
    key: "unregister",
    value: function unregister(itemId) {
      var ws = this._ws;
      console.info("[register]: Unregistering " + itemId);
      var items = this._items;

      if (items.has(itemId)) {
        items["delete"](itemId);
        var _ws = this._ws;

        _ws.send("-" + itemId); // currently only the raw id will be sent


        if (items.size == 0) _ws.close();
      }
    }
  }, {
    key: "getNewData",
    value: function getNewData(itemId) {
      console.info("[getNewData]: Called for " + itemId);
      if (this._itemData === undefined) return null;else return this._itemData.get(parseInt(itemId));
    }
    /* ----------------------------- private methods below ----------------------------- */

  }, {
    key: "createWebsocket",
    value: function createWebsocket(hostname, port, service, itemId) {
      var items = this._items; //let ws    = new WebSocket('wss://' + hostname + ':8880/');

      var wsUrl = 'wss://' + hostname + ':' + port + '/' + service;
      var ws = new WebSocket(wsUrl);
      console.info("[WebsocketService]: Connection to '" + wsUrl + "'");
      var websocketService = this;

      ws.onopen = function () {
        console.debug("[openSocket]: websocket is open.");
        ws.send(itemId);

        var websocketUpdate = function websocketUpdate() {
          if (websocketService._items.size > 0) {
            console.info("[WebsocketService]: Sending empty request");
            ws.send("\n");
          }
        };

        websocketService._updateFunction = websocketUpdate;
        setInterval(websocketUpdate, 30000);
      };

      ws.onmessage = function (event) {
        var data = event.data;
        console.debug("[onmessage]: Data received " + data);
        websocketService._itemData = websocketService.update(data);
      };

      ws.onerror = function (event) {
        console.error("[openSocket]: " + event.data);
      };

      ws.onclose = function (event) {
        if (items.size > 0) {
          alert("WARNUNG: Verbindung wurde unterbrochen - bitte neu aufbauen.");
        }
      };

      this._ws = ws;
    }
  }, {
    key: "getWebsocket",
    value: function getWebsocket() {
      return this._ws;
    }
  }, {
    key: "update",
    value: function update(data) {
      try {
        var itemData = new Map();
        var updatelist = JSON.parse(data);
        console.info("[update]: " + Object.keys(updatelist));

        for (var _i = 0, _Object$keys = Object.keys(updatelist); _i < _Object$keys.length; _i++) {
          var key = _Object$keys[_i];
          itemData.set(parseInt(key), updatelist[key]);
        }

        return itemData;
      } catch (error) {
        console.warn("Warning: No valid JSON - ignoring data (and this might be okay).");
      }
    }
  }]);

  return WebsocketService;
}();