/**
 * 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);
