/**
 * Controller for power-usage
 *
 * @module app/serverControl
 * @exports powerUsageController
 * @name powerUsageController
 */

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

  angular.module('app.serverControl').controller('powerUsageController', [
    '$scope', '$window', 'APIUtils', '$route', '$q',
    function($scope, $window, APIUtils, $route, $q) {
      $scope.power_consumption = '';
      $scope.power_cap = {};
      $scope.set_power_cap_error = false;
      $scope.set_power_cap_success = false;
      $scope.loading = false;
      loadPowerData();

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

        var getPowerCapPromise = APIUtils.getPowerCap().then(
            function(data) {
              $scope.power_cap = 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 promises = [
          getPowerConsumptionPromise,
          getPowerCapPromise,
        ];

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

      $scope.setPowerCap = function() {
        $scope.set_power_cap_error = false;
        $scope.set_power_cap_success = false;
        // The power cap value will be undefined if outside range
        if (!$scope.power_cap.PowerCap) {
          $scope.set_power_cap_error = true;
          return;
        }
        $scope.loading = true;
        var promises = [
          setPowerCapValue(),
          setPowerCapEnable(),
        ];

        $q.all(promises).finally(function() {
          $scope.loading = false;
          if (!$scope.set_power_cap_error) {
            $scope.set_power_cap_success = true;
          }
        });
      };
      $scope.refresh = function() {
        $route.reload();
      };

      function setPowerCapValue() {
        return APIUtils.setPowerCap($scope.power_cap.PowerCap)
            .then(
                function(data) {},
                function(error) {
                  $scope.set_power_cap_error = true;
                  console.log(JSON.stringify(error));
                });
      }

      function setPowerCapEnable() {
        return APIUtils.setPowerCapEnable($scope.power_cap.PowerCapEnable)
            .then(
                function(data) {},
                function(error) {
                  $scope.set_power_cap_error = true;
                  console.log(JSON.stringify(error));
                });
      }
    }
  ]);
})(angular);
