/**
 * An element which displays a table of events on a repository and allows them to be
 * edited.
 */
angular.module('quay').directive('repositoryEventsTable', function () {
  var directiveDefinitionObject = {
    priority: 0,
    templateUrl: '/static/directives/repository-events-table.html',
    replace: false,
    transclude: true,
    restrict: 'C',
    scope: {
      'repository': '=repository',
      'isEnabled': '=isEnabled'
    },
    controller: function($scope, $element, ApiService, Restangular, UtilService, ExternalNotificationData) {
      $scope.showNewNotificationCounter = 0;

      var loadNotifications = function() {
        if (!$scope.repository || $scope.notificationsResource || !$scope.isEnabled) { return; }

        var params = {
          'repository': $scope.repository.namespace + '/' + $scope.repository.name
        };

        $scope.notificationsResource = ApiService.listRepoNotificationsAsResource(params).get(
          function(resp) {
            $scope.notifications = resp.notifications;
            return $scope.notifications;
          });
      };

      $scope.$watch('repository', loadNotifications);
      $scope.$watch('isEnabled', loadNotifications);

      loadNotifications();

      $scope.handleNotificationCreated = function(notification) {
        $scope.notifications.push(notification);
      };

      $scope.askCreateNotification = function() {
        $scope.showNewNotificationCounter++;
      };

      $scope.getEventInfo = function(notification) {
        return ExternalNotificationData.getEventInfo(notification.event);
      };

      $scope.getMethodInfo = function(notification) {
        return ExternalNotificationData.getMethodInfo(notification.method);
      };

      $scope.deleteNotification = function(notification) {
        var params = {
          'repository': $scope.repository.namespace + '/' + $scope.repository.name,
          'uuid': notification.uuid
        };

        ApiService.deleteRepoNotification(null, params).then(function() {
          var index = $.inArray(notification, $scope.notifications);
          if (index < 0) { return; }
          $scope.notifications.splice(index, 1);
        }, ApiService.errorDisplay('Cannot delete notification'));
      };

      $scope.showWebhookInfo = function(notification) {
        var eventId = notification.event;
        document.location = 'http://docs.quay.io/guides/notifications.html#webhook_' + eventId;
      };

      $scope.testNotification = function(notification) {
        var params = {
          'repository': $scope.repository.namespace + '/' + $scope.repository.name,
          'uuid': notification.uuid
        };

        ApiService.testRepoNotification(null, params).then(function() {
          bootbox.dialog({
            "title": "Test Notification Queued",
            "message": "A test version of this notification has been queued and should appear shortly",
            "buttons": {
              "close": {
                "label": "Close",
                "className": "btn-primary"
              }
            }
          });
        }, ApiService.errorDisplay('Could not issue test notification'));
      };

    }
  };
  return directiveDefinitionObject;
});