/**
 * Element for managing the robots owned by an organization or a user.
 */
angular.module('quay').directive('robotsManager', function () {
  var directiveDefinitionObject = {
    priority: 0,
    templateUrl: '/static/directives/robots-manager.html',
    replace: false,
    transclude: false,
    restrict: 'C',
    scope: {
      'organization': '=organization',
      'user': '=user',
      'isEnabled': '=isEnabled'
    },
    controller: function($scope, $element, ApiService, $routeParams, $location, CreateService,
                         Config, $rootScope) {
      $scope.ROBOT_PATTERN = ROBOT_PATTERN;

      $scope.robots = null;
      $scope.loading = false;
      $scope.shownRobot = null;
      $scope.showRobotCounter = 0;
      $scope.Config = Config;
      $scope.feedback = null;

      // Listen for route changes and update the tabs accordingly.
      var locationListener = $rootScope.$on('$routeUpdate', function(){
        if ($location.search()['showRobot']) {
          $scope.filterToRobot($location.search()['showRobot']);
        }
      });

      $scope.$on('$destroy', function() {
        locationListener && locationListener();
      });

      var loadRobotPermissions = function(info) {
        var shortName = $scope.getShortenedName(info.name);
        info.loading_permissions = true;
        ApiService.getRobotPermissions($scope.organization, null, {'robot_shortname': shortName}).then(function(resp) {
          info.permissions = resp.permissions;
          info.loading_permissions = false;
        }, ApiService.errorDisplay('Could not load robot permissions'));
      };

      $scope.filterToRobot = function(robotName) {
        if ($scope.robotFilter == robotName) {
          return;
        }

        var index = $scope.findRobotIndexByName(robotName);
        if (index < 0) {
          // Robot doesn't exist. Reload the list to see if we can find it.
          update();
        }

        $scope.robotFilter = robotName;
      };

      $scope.showPermissions = function(robotInfo) {
        robotInfo.showing_permissions = !robotInfo.showing_permissions;

        if (robotInfo.showing_permissions) {
          loadRobotPermissions(robotInfo);
        }
      };

      $scope.regenerateToken = function(username) {
        if (!username) { return; }

        var shortName = $scope.getShortenedName(username);
        ApiService.regenerateRobotToken($scope.organization, null, {'robot_shortname': shortName}).then(function(updated) {
          var index = $scope.findRobotIndexByName(username);
          if (index >= 0) {
            $scope.robots.splice(index, 1);
            $scope.robots.push(updated);
          }
          $scope.shownRobot = updated;
        }, ApiService.errorDisplay('Cannot regenerate robot account token'));
      };

      $scope.showRobot = function(info) {
        $scope.shownRobot = info;
        $scope.showRobotCounter++;
      };

      $scope.findRobotIndexByName = function(name) {
        if (!$scope.robots) { return -1; }

        for (var i = 0; i < $scope.robots.length; ++i) {
          if ($scope.robots[i].name == name) {
            return i;
          }
        }
        return -1;
      };

      $scope.getShortenedRobotName = function(info) {
        return $scope.getShortenedName(info.name);
      };

      $scope.getShortenedName = function(name) {
        var plus = name.indexOf('+');
        return name.substr(plus + 1);
      };

      $scope.getPrefix = function(name) {
        var plus = name.indexOf('+');
        return name.substr(0, plus);
      };

      $scope.createRobot = function(name) {
        if (!name) { return; }

        CreateService.createRobotAccount(ApiService, !!$scope.organization, $scope.organization ? $scope.organization.name : '', name,
          function(created) {
            created.teams = [];
            created.repositories = [];
            $scope.robots.push(created);
            $scope.feedback = {
              'kind': 'success',
              'message': 'Robot account {robot} was created',
              'data': {
                'robot': name
              }
            };
          });
      };

      $scope.deleteRobot = function(info) {
        var shortName = $scope.getShortenedName(info.name);
        ApiService.deleteRobot($scope.organization, null, {'robot_shortname': shortName}).then(function(resp) {
          var index = $scope.findRobotIndexByName(info.name);
          if (index >= 0) {
            $scope.robots.splice(index, 1);
            $scope.feedback = {
              'kind': 'success',
              'message': 'Robot account {robot} was deleted',
              'data': {
                'robot': info.name
              }
            };
          }
        }, ApiService.errorDisplay('Cannot delete robot account'));
      };


      $scope.askDeleteRobot = function(info) {
        bootbox.confirm('Are you sure you want to delete robot ' + info.name + '?', function(resp) {
          if (resp) {
            $scope.deleteRobot(info);
          }
        });
      };

      var update = function() {
        if (!$scope.user && !$scope.organization) { return; }
        if ($scope.loading || !$scope.isEnabled) { return; }

        var params = {
          'permissions': true
        };

        $scope.loading = true;
        ApiService.getRobots($scope.organization, null, params).then(function(resp) {
          $scope.robots = resp.robots;
          $scope.loading = false;

          if ($routeParams.showRobot) {
            $scope.filterToRobot($routeParams.showRobot);
          }
        });
      };

      $scope.$watch('isEnabled', update);
      $scope.$watch('organization', update);
      $scope.$watch('user', update);
    }
  };
  return directiveDefinitionObject;
});