/**
 * Controller for server
 *
 * @module app/serverControl
 * @exports remoteConsoleController
 * @name remoteConsoleController
 */

import {hterm, lib} from 'hterm-umdjs';

window.angular && (function(angular) {
  'use strict';

  angular.module('app.serverControl').controller('remoteConsoleController', [
    '$scope', '$window', 'APIUtils', 'dataService',
    function($scope, $window, APIUtils, dataService) {
      $scope.dataService = dataService;

      // See https://github.com/macton/hterm for available hterm options

      hterm.defaultStorage = new lib.Storage.Local();
      var term = new hterm.Terminal('host-console');
      term.decorate(document.querySelector('#terminal'));
      // Set cursor color
      term.prefs_.set('cursor-color', 'rgba(83, 146, 255, .5)');
      // Set background color
      term.prefs_.set('background-color', '#19273c');
      // Allows keyboard input
      term.installKeyboard();

      // The BMC exposes a websocket at /console0. This can be read
      // or written to access the host serial console.
      var hostname = dataService.getHost().replace('https://', '');
      var host = 'wss://' + hostname + '/console0';
      var ws = new WebSocket(host);
      ws.onmessage = function(evt) {
        // websocket -> terminal
        term.io.print(evt.data);
      };

      // terminal -> websocket
      term.onTerminalReady = function() {
        var io = term.io.push();
        io.onVTKeystroke = function(str) {
          ws.send(str);
        };
        io.sendString = function(str) {
          ws.send(str);
        };
      };

      ws.onopen = function() {
        console.log('websocket opened');
      };
      ws.onclose = function() {
        console.log('websocket closed');
      };
      $scope.$on('$destroy', function() {
        if (ws) {
          ws.close();
        }
      });

      $scope.openTerminalWindow = function() {
        dataService.setRemoteWindowActive();
        $window.open(
            '#/server-control/remote-console-window', 'Remote Console Window',
            'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=600,height=400');
      };
    }
  ]);

})(angular);
