(function() {
  /**
   * DEPRECATED: Repository admin/settings page.
   */
  angular.module('quayPages').config(['pages', function(pages) {
    pages.create('repo-admin', 'repo-admin.html', RepoAdminCtrl);
  }]);

  function RepoAdminCtrl($scope, Restangular, ApiService, KeyService, TriggerService, $routeParams,
    $rootScope, $location, UserService, Config, Features, ExternalNotificationData, UtilService) {

    var namespace = $routeParams.namespace;
    var name = $routeParams.name;

    $scope.Features = Features;
    $scope.TriggerService = TriggerService;
    $scope.KeyService = KeyService;

    $scope.permissions = {'team': [], 'user': [], 'loading': 2};
    $scope.logsShown = 0;
    $scope.deleting = false;

    $scope.permissionCache = {};
    $scope.showTriggerSetupCounter = 0;

    $scope.getBadgeFormat = function(format, repo) {
      if (!repo) { return; }

      var imageUrl = Config.getUrl('/repository/' + namespace + '/' + name + '/status');
      if (!$scope.repo.is_public) {
        imageUrl += '?token=' + $scope.repo.status_token;
      }

      var linkUrl = Config.getUrl('/repository/' + namespace + '/' + name);

      switch (format) {
        case 'svg':
          return imageUrl;

        case 'md':
          return '[![Docker Repository on ' + Config.REGISTRY_TITLE_SHORT + '](' + imageUrl +
            ' "Docker Repository on ' + Config.REGISTRY_TITLE_SHORT  + '")](' + linkUrl + ')';

        case 'asciidoc':
          return 'image:' + imageUrl + '["Docker Repository on ' + Config.REGISTRY_TITLE_SHORT  + '", link="' + linkUrl + '"]';
      }

      return '';
    };

    $scope.buildEntityForPermission = function(name, permission, kind) {
      var key = name + ':' + kind;
      if ($scope.permissionCache[key]) {
        return $scope.permissionCache[key];
      }

      return $scope.permissionCache[key] = {
        'kind': kind,
        'name': name,
        'is_robot': permission.is_robot,
        'is_org_member': permission.is_org_member
      };
    };

    $scope.loadLogs = function() {
      $scope.logsShown++;
    };

    $scope.grantRole = function() {
      $('#confirmaddoutsideModal').modal('hide');
      var entity = $scope.currentAddEntity;
      $scope.addRole(entity.name, 'read', entity.kind, entity.is_org_member)
      $scope.currentAddEntity = null;
    };

    $scope.addNewPermission = function(entity) {
      // Don't allow duplicates.
      if (!entity || !entity.kind || $scope.permissions[entity.kind][entity.name]) { return; }

      if (entity.is_org_member === false) {
        $scope.currentAddEntity = entity;
        $('#confirmaddoutsideModal').modal('show');
        return;
      }

      $scope.addRole(entity.name, 'read', entity.kind);
    };

    $scope.deleteRole = function(entityName, kind) {
      var errorHandler = ApiService.errorDisplay('Cannot change permission', function(resp) {
        if (resp.status == 409) {
          return 'Cannot change permission as you do not have the authority';
        }
      });

      var permissionDelete = Restangular.one(UtilService.getRestUrl('repository', namespace, name, 'permissions', kind, entityName));
      permissionDelete.customDELETE().then(function() {
        delete $scope.permissions[kind][entityName];
      }, errorHandler);
    };

    $scope.addRole = function(entityName, role, kind) {
      var permission = {
        'role': role,
      };

      var permissionPost = Restangular.one(UtilService.getRestUrl('repository', namespace, name, 'permissions', kind, entityName));
      permissionPost.customPUT(permission).then(function(result) {
        $scope.permissions[kind][entityName] = result;
      }, ApiService.errorDisplay('Cannot change permission'));
    };

    $scope.setRole = function(role, entityName, kind) {
      var permission = $scope.permissions[kind][entityName];
      var currentRole = permission.role;
      permission.role = role;

      var permissionPut = Restangular.one(UtilService.getRestUrl('repository', namespace, name, 'permissions', kind, entityName));
      permissionPut.customPUT(permission).then(function() {}, function(resp) {
        $scope.permissions[kind][entityName] = {'role': currentRole};
        $scope.changePermError = null;
        if (resp.status == 409 || resp.data) {
          $scope.changePermError = resp.data || '';
          $('#channgechangepermModal').modal({});
        } else {
          $('#cannotchangeModal').modal({});
        }
      });
    };

    $scope.newTokenName = null;

    $scope.createToken = function() {
      var data = {
        'friendlyName': $scope.newTokenName
      };

      var params = {'repository': namespace + '/' + name};
      ApiService.createToken(data, params).then(function(newToken) {
        $scope.newTokenName = null;
        $scope.createTokenForm.$setPristine();
        $scope.tokens[newToken.code] = newToken;
      });
    };

    $scope.deleteToken = function(tokenCode) {
      var params = {
        'repository': namespace + '/' + name,
        'code': tokenCode
      };

      ApiService.deleteToken(null, params).then(function() {
        delete $scope.tokens[tokenCode];
      });
    };

    $scope.changeTokenAccess = function(tokenCode, newAccess) {
      var role = {
        'role': newAccess
      };

      var params = {
        'repository': namespace + '/' + name,
        'code': tokenCode
      };

      ApiService.changeToken(role, params).then(function(updated) {
        $scope.tokens[updated.code] = updated;
      });
    };

    $scope.shownTokenCounter = 0;

    $scope.showToken = function(tokenCode) {
      $scope.shownToken = $scope.tokens[tokenCode];
      $scope.shownTokenCounter++;
    };

    $scope.askChangeAccess = function(newAccess) {
      $('#make' + newAccess + 'Modal').modal({});
    };

    $scope.changeAccess = function(newAccess) {
      $('#make' + newAccess + 'Modal').modal('hide');

      var visibility = {
        'visibility': newAccess
      };

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

      ApiService.changeRepoVisibility(visibility, params).then(function() {
        $scope.repo.is_public = newAccess == 'public';
      }, function() {
        $('#cannotchangeModal').modal({});
      });
    };

    $scope.askDelete = function() {
      $('#confirmdeleteModal').modal({});
    };

    $scope.deleteRepo = function() {
      $('#confirmdeleteModal').modal('hide');

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

      $scope.deleting = true;
      ApiService.deleteRepository(null, params).then(function() {
        $scope.repo = null;

        setTimeout(function() {
          document.location = '/repository/';
        }, 1000);
      }, function() {
        $scope.deleting = true;
        $('#cannotchangeModal').modal({});
      });
    };

    $scope.showNewNotificationCounter = 0;

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

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

    $scope.handleNotificationDeleted = function(notification) {
      var index = $.inArray(notification, $scope.notifications);
      if (index < 0) { return; }
      $scope.notifications.splice(index, 1);
    };

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

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

    $scope.showBuild = function(buildInfo) {
      $location.path('/repository/' + namespace + '/' + name + '/build');
      $location.search('current', buildInfo.id);
    };

    $scope.loadTriggerBuildHistory = function(trigger) {
      trigger.$loadingHistory = true;

      var params = {
        'repository': namespace + '/' + name,
        'trigger_uuid': trigger.id,
        'limit': 3
      };

      ApiService.listTriggerRecentBuilds(null, params).then(function(resp) {
        trigger.$builds = resp['builds'];
        trigger.$loadingHistory = false;
      });
    };

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

      $scope.triggersResource = ApiService.listBuildTriggersAsResource(params).get(function(resp) {
        $scope.triggers = resp.triggers;

        // Check to see if we need to setup any trigger.
        var newTriggerId = $routeParams.new_trigger;
        if (newTriggerId) {
          for (var i = 0; i < $scope.triggers.length; ++i) {
            var trigger = $scope.triggers[i];
            if (trigger['id'] == newTriggerId && !trigger['is_active']) {
              $scope.setupTrigger(trigger);
              break;
            }
          }
        }

        return $scope.triggers;
      });
    };

    $scope.setupTrigger = function(trigger) {
      $scope.currentSetupTrigger = trigger;
      $scope.showTriggerSetupCounter++;
    };

    $scope.cancelSetupTrigger = function(trigger) {
      if ($scope.currentSetupTrigger != trigger) { return; }

      $scope.currentSetupTrigger = null;
      $scope.deleteTrigger(trigger);
    };

    $scope.showManualBuildDialog = 0;

    $scope.startTrigger = function(trigger, opt_custom) {
      var parameters = TriggerService.getRunParameters(trigger.service);
      if (parameters.length && !opt_custom) {
        $scope.currentStartTrigger = trigger;
        $scope.showManualBuildDialog++;
        return;
      }

      var params = {
        'repository': namespace + '/' + name,
        'trigger_uuid': trigger.id
      };

      ApiService.manuallyStartBuildTrigger(opt_custom || {}, params).then(function(resp) {
        var url = '/repository/' + namespace + '/' + name + '/build?current=' + resp['id'];
        document.location = url;
      }, ApiService.errorDisplay('Could not start build'));
    };

    $scope.deleteTrigger = function(trigger) {
      if (!trigger) { return; }

      var params = {
        'repository': namespace + '/' + name,
        'trigger_uuid': trigger.id
      };

      ApiService.deleteBuildTrigger(null, params).then(function(resp) {
        $scope.triggers.splice($scope.triggers.indexOf(trigger), 1);
      });
    };

    var fetchTokens = function() {
      var params = {
        'repository': namespace + '/' + name
      };

      ApiService.listRepoTokens(null, params).then(function(resp) {
        $scope.tokens = resp.tokens;
      }, function() {
        $scope.tokens = null;
      });
    };

    var fetchPermissions = function(kind) {
      var permissionsFetch = Restangular.one('repository/' + namespace + '/' + name + '/permissions/' + kind + '/');
      permissionsFetch.get().then(function(resp) {
        $scope.permissions[kind] = resp.permissions;
        $scope.permissions['loading']--;
      }, function() {
        $scope.permissions[kind] = null;
      });
    };

    var fetchRepository = function() {
      var params = {
        'repository': namespace + '/' + name
      };

      $scope.repository = ApiService.getRepoAsResource(params).get(function(repo) {
        if (!repo.can_admin) {
          $rootScope.title = 'Forbidden';
          $scope.accessDenied = true;
          return;
        }

        $scope.repo = repo;
        $rootScope.title = 'Settings - ' + namespace + '/' + name;
        $rootScope.description = 'Administrator settings for ' + namespace + '/' + name +
            ': Permissions, notifications and other settings';

        // Fetch all the permissions and token info for the repository.
        fetchPermissions('user');
        fetchPermissions('team');
        fetchTokens();

        $('.info-icon').popover({
          'trigger': 'hover',
          'html': true
        });

        return $scope.repo;
      });
    };

    // Fetch the repository.
    fetchRepository();
  }
})();