angular.module('endpoints', [])
.controller('EndpointsController', ['$scope', '$state', 'EndpointService', 'EndpointProvider', 'Notifications', 'Pagination',
function ($scope, $state, EndpointService, EndpointProvider, Notifications, Pagination) {
  $scope.state = {
    error: '',
    uploadInProgress: false,
    selectedItemCount: 0,
    pagination_count: Pagination.getPaginationCount('endpoints')
  };
  $scope.sortType = 'Name';
  $scope.sortReverse = true;

  $scope.formValues = {
    Name: '',
    URL: '',
    PublicURL: '',
    TLS: false,
    TLSCACert: null,
    TLSCert: null,
    TLSKey: null
  };

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

  $scope.changePaginationCount = function() {
    Pagination.setPaginationCount('endpoints', $scope.state.pagination_count);
  };

  $scope.selectItems = function (allSelected) {
    angular.forEach($scope.state.filteredEndpoints, function (endpoint) {
      if (endpoint.Checked !== allSelected) {
        endpoint.Checked = allSelected;
        $scope.selectItem(endpoint);
      }
    });
  };

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

  $scope.addEndpoint = function() {
    $scope.state.error = '';
    var name = $scope.formValues.Name;
    var URL = $scope.formValues.URL;
    var PublicURL = $scope.formValues.PublicURL;
    if (PublicURL === '') {
      PublicURL = URL.split(':')[0];
    }
    var TLS = $scope.formValues.TLS;
    var TLSCAFile = $scope.formValues.TLSCACert;
    var TLSCertFile = $scope.formValues.TLSCert;
    var TLSKeyFile = $scope.formValues.TLSKey;
    EndpointService.createRemoteEndpoint(name, URL, PublicURL, TLS, TLSCAFile, TLSCertFile, TLSKeyFile, false).then(function success(data) {
      Notifications.success('Endpoint created', name);
      $state.reload();
    }, function error(err) {
      $scope.state.uploadInProgress = false;
      $scope.state.error = err.msg;
    }, function update(evt) {
      if (evt.upload) {
        $scope.state.uploadInProgress = evt.upload;
      }
    });
  };

  $scope.removeAction = function () {
    $('#loadEndpointsSpinner').show();
    var counter = 0;
    var complete = function () {
      counter = counter - 1;
      if (counter === 0) {
        $('#loadEndpointsSpinner').hide();
      }
    };
    angular.forEach($scope.endpoints, function (endpoint) {
      if (endpoint.Checked) {
        counter = counter + 1;
        EndpointService.deleteEndpoint(endpoint.Id).then(function success(data) {
          Notifications.success('Endpoint deleted', endpoint.Name);
          var index = $scope.endpoints.indexOf(endpoint);
          $scope.endpoints.splice(index, 1);
          complete();
        }, function error(err) {
          Notifications.error('Failure', err, 'Unable to remove endpoint');
          complete();
        });
      }
    });
  };

  function fetchEndpoints() {
    $('#loadEndpointsSpinner').show();
    EndpointService.endpoints()
    .then(function success(data) {
      $scope.endpoints = data;
      $scope.activeEndpointID = EndpointProvider.endpointID();
    })
    .catch(function error(err) {
      Notifications.error('Failure', err, 'Unable to retrieve endpoints');
      $scope.endpoints = [];
    })
    .finally(function final() {
      $('#loadEndpointsSpinner').hide();
    });
  }

  fetchEndpoints();
}]);