angular.module('services', [])
.controller('ServicesController', ['$scope', '$stateParams', '$state', 'Service', 'ServiceHelper', 'Messages', 'Settings',
function ($scope, $stateParams, $state, Service, ServiceHelper, Messages, Settings) {
  $scope.state = {};
  $scope.state.selectedItemCount = 0;
  $scope.sortType = 'Name';
  $scope.sortReverse = false;
  $scope.pagination_count = Settings.pagination_count;

  $scope.scaleService = function scaleService(service) {
    $('#loadServicesSpinner').show();
    var config = ServiceHelper.serviceToConfig(service.Model);
    config.Mode.Replicated.Replicas = service.Replicas;
    Service.update({ id: service.Id, version: service.Version }, config, function (data) {
      $('#loadServicesSpinner').hide();
      Messages.send("Service successfully scaled", "New replica count: " + service.Replicas);
      $state.go('services', {}, {reload: true});
    }, function (e) {
      $('#loadServicesSpinner').hide();
      service.Scale = false;
      service.Replicas = service.ReplicaCount;
      Messages.error("Failure", e, "Unable to scale service");
    });
  };

  $scope.order = function (sortType) {
    $scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
    $scope.sortType = sortType;
  };

  $scope.selectItem = function (item) {
    if (item.Checked) {
      $scope.state.selectedItemCount++;
    } else {
      $scope.state.selectedItemCount--;
    }
  };

  $scope.removeAction = function () {
    $('#loadServicesSpinner').show();
    var counter = 0;
    var complete = function () {
      counter = counter - 1;
      if (counter === 0) {
        $('#loadServicesSpinner').hide();
      }
    };
    angular.forEach($scope.services, function (service) {
      if (service.Checked) {
        counter = counter + 1;
        Service.remove({id: service.Id}, function (d) {
          if (d.message) {
            $('#loadServicesSpinner').hide();
            Messages.error("Unable to remove service", {}, d[0].message);
          } else {
            Messages.send("Service deleted", service.Id);
            var index = $scope.services.indexOf(service);
            $scope.services.splice(index, 1);
          }
          complete();
        }, function (e) {
          Messages.error("Failure", e, 'Unable to remove service');
          complete();
        });
      }
    });
  };

  function fetchServices() {
    $('#loadServicesSpinner').show();
    Service.query({}, function (d) {
      $scope.services = d.map(function (service) {
        return new ServiceViewModel(service);
      });
      $('#loadServicesSpinner').hide();
    }, function(e) {
      $('#loadServicesSpinner').hide();
      Messages.error("Failure", e, "Unable to retrieve services");
      $scope.services = [];
    });
  }

  fetchServices();
}]);