/**
 * Controller for systemOverview
 *
 * @module app/overview
 * @exports systemOverviewController
 * @name systemOverviewController
 */

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

  angular.module('app.overview').controller('systemOverviewController', [
    '$scope', '$window', 'APIUtils', 'dataService', 'Constants', '$q',
    function($scope, $window, APIUtils, dataService, Constants, $q) {
      $scope.dataService = dataService;
      $scope.dropdown_selected = false;
      $scope.tmz = 'EDT';
      $scope.logs = [];
      $scope.server_info = {};
      $scope.bmc_firmware = '';
      $scope.bmc_time = '';
      $scope.server_firmware = '';
      $scope.power_consumption = '';
      $scope.power_cap = '';
      $scope.bmc_ip_addresses = [];
      $scope.loading = false;
      $scope.edit_hostname = false;

      loadOverviewData();

      function loadOverviewData() {
        $scope.loading = true;

        var getLogsPromise = APIUtils.getLogs().then(
            function(data) {
              $scope.logs = data.data.filter(function(log) {
                return log.severity_flags.high == true;
              });
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var getFirmwaresPromise = APIUtils.getFirmwares().then(
            function(data) {
              $scope.bmc_firmware = data.bmcActiveVersion;
              $scope.server_firmware = data.hostActiveVersion;
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var getLEDStatePromise = APIUtils.getLEDState().then(
            function(data) {
              if (data == APIUtils.LED_STATE.on) {
                dataService.LED_state = APIUtils.LED_STATE_TEXT.on;
              } else {
                dataService.LED_state = APIUtils.LED_STATE_TEXT.off;
              }
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var getBMCTimePromise = APIUtils.getBMCTime().then(
            function(data) {
              $scope.bmc_time = data.data.Elapsed / 1000;
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var getServerInfoPromise = APIUtils.getServerInfo().then(
            function(data) {
              $scope.server_info = data.data;
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var getPowerConsumptionPromise = APIUtils.getPowerConsumption().then(
            function(data) {
              $scope.power_consumption = data;
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var getPowerCapPromise = APIUtils.getPowerCap().then(
            function(data) {
              if (data.data.PowerCapEnable == false) {
                $scope.power_cap = Constants.POWER_CAP_TEXT.disabled;
              } else {
                $scope.power_cap =
                    data.data.PowerCap + ' ' + Constants.POWER_CAP_TEXT.unit;
              }
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var getNetworkInfoPromise = APIUtils.getNetworkInfo().then(
            function(data) {
              // TODO: openbmc/openbmc#3150 Support IPV6 when
              // officially supported by the backend
              $scope.bmc_ip_addresses = data.formatted_data.ip_addresses.ipv4;
            },
            function(error) {
              console.log(JSON.stringify(error));
            });

        var promises = [
          getLogsPromise,
          getFirmwaresPromise,
          getLEDStatePromise,
          getBMCTimePromise,
          getServerInfoPromise,
          getPowerConsumptionPromise,
          getPowerCapPromise,
          getNetworkInfoPromise,
        ];

        $q.all(promises).finally(function() {
          $scope.loading = false;
        });
      }

      $scope.toggleLED = function() {
        var toggleState =
            (dataService.LED_state == APIUtils.LED_STATE_TEXT.on) ?
            APIUtils.LED_STATE.off :
            APIUtils.LED_STATE.on;
        dataService.LED_state =
            (dataService.LED_state == APIUtils.LED_STATE_TEXT.on) ?
            APIUtils.LED_STATE_TEXT.off :
            APIUtils.LED_STATE_TEXT.on;
        APIUtils.setLEDState(toggleState, function(status) {});
      };

      $scope.saveHostname = function(hostname) {
        $scope.edit_hostname = false;
        $scope.loading = true;
        APIUtils.setHostname(hostname).then(
            function(data) {
              APIUtils.getNetworkInfo().then(function(data) {
                dataService.setNetworkInfo(data);
              });
            },
            function(error) {
              console.log(error);
            });
        $scope.loading = false;
      };

      $scope.getEventLogTitle = function(event) {
        var title = event.type;
        if ((event.eventID != 'None') && (event.description != 'None')) {
          title = event.eventID + ': ' + event.description;
        }
        return title;
      };
    }
  ]);
})(angular);
