(function() {
  /**
   * Page that displays details about an organization, such as its teams.
   */
  angular.module('quayPages').config(['pages', function(pages) {
    pages.create('org-view', 'org-view.html', OrgViewCtrl, {
      'newLayout': true,
      'title': 'Organization {{ organization.name }}',
      'description': 'Organization {{ organization.name }}'
    }, ['layout'])

    pages.create('org-view', 'old-org-view.html', OldOrgViewCtrl, {
    }, ['old-layout']);
  }]);

  function OrgViewCtrl($scope, $routeParams, $timeout, ApiService, UIService, AvatarService) {
    var orgname = $routeParams.orgname;

    $scope.showLogsCounter = 0;
    $scope.showApplicationsCounter = 0;
    $scope.showInvoicesCounter = 0;
    $scope.showRobotsCounter = 0;
    $scope.showTeamsCounter = 0;

    $scope.orgScope = {
      'changingOrganization': false,
      'organizationEmail': ''
    };

    $scope.$watch('orgScope.organizationEmail', function(e) {
      UIService.hidePopover('#changeEmailForm input');
    });

    var loadRepositories = function() {
      var options = {
        'namespace_only': true,
        'namespace': orgname,
      };

      $scope.repositoriesResource = ApiService.listReposAsResource().withOptions(options).get(function(resp) {
        return resp.repositories;
      });
    };

    var loadOrganization = function() {
      $scope.orgResource = ApiService.getOrganizationAsResource({'orgname': orgname}).get(function(org) {
        $scope.organization = org;
        $scope.orgScope.organizationEmail = org.email;
        $scope.isAdmin = org.is_admin;
        $scope.isMember = org.is_member;

        // Load the repositories.
        $timeout(function() {
          loadRepositories();
        }, 10);
      });
    };

    // Load the organization.
    loadOrganization();

    $scope.showRobots = function() {
      $scope.showRobotsCounter++;
    };

    $scope.showTeams = function() {
      $scope.showTeamsCounter++;
    };

    $scope.showInvoices = function() {
      $scope.showInvoicesCounter++;
    };

    $scope.showApplications = function() {
      $scope.showApplicationsCounter++;
    };

    $scope.showLogs = function() {
      $scope.showLogsCounter++;
    };

    $scope.changeEmail = function() {
      UIService.hidePopover('#changeEmailForm input');

      $scope.orgScope.changingOrganization = true;
      var params = {
        'orgname': orgname
      };

      var data = {
        'email': $scope.orgScope.organizationEmail
      };

      ApiService.changeOrganizationDetails(data, params).then(function(org) {
        $scope.orgScope.changingOrganization = false;
        $scope.organization = org;
      }, function(result) {
        $scope.orgScope.changingOrganization = false;
        UIService.showFormError('#changeEmailForm input', result, 'right');
      });
    };
  }

  function OldOrgViewCtrl($rootScope, $scope, ApiService, $routeParams, CreateService) {
    var orgname = $routeParams.orgname;

    $scope.TEAM_PATTERN = TEAM_PATTERN;
    $rootScope.title = 'Loading...';

    $scope.setRole = function(role, teamname) {
      var previousRole = $scope.organization.teams[teamname].role;
      $scope.organization.teams[teamname].role = role;

      var params = {
        'orgname': orgname,
        'teamname': teamname
      };

      var data = $scope.organization.teams[teamname];

      ApiService.updateOrganizationTeam(data, params).then(function(resp) {
      }, function(resp) {
        $scope.organization.teams[teamname].role = previousRole;
        $scope.roleError = resp.data || '';
        $('#cannotChangeTeamModal').modal({});
      });
    };

    $scope.createTeam = function(teamname) {
      if (!teamname) {
        return;
      }

      if ($scope.organization.teams[teamname]) {
        $('#team-' + teamname).removeClass('highlight');
        setTimeout(function() {
          $('#team-' + teamname).addClass('highlight');
        }, 10);
        return;
      }

      CreateService.createOrganizationTeam(ApiService, orgname, teamname, function(created) {
        $scope.organization.teams[teamname] = created;
      });
    };

    $scope.askDeleteTeam = function(teamname) {
      $scope.currentDeleteTeam = teamname;
      $('#confirmdeleteModal').modal({});
    };

    $scope.deleteTeam = function() {
      $('#confirmdeleteModal').modal('hide');
      if (!$scope.currentDeleteTeam) { return; }

      var teamname = $scope.currentDeleteTeam;
      var params = {
        'orgname': orgname,
        'teamname': teamname
      };

      var errorHandler = ApiService.errorDisplay('Cannot delete team', function() {
        $scope.currentDeleteTeam = null;
      });

      ApiService.deleteOrganizationTeam(null, params).then(function() {
        delete $scope.organization.teams[teamname];
        $scope.currentDeleteTeam = null;
      }, errorHandler);
    };

    var loadOrganization = function() {
      $scope.orgResource = ApiService.getOrganizationAsResource({'orgname': orgname}).get(function(org) {
        $scope.organization = org;
        $rootScope.title = orgname;
        $rootScope.description = 'Viewing organization ' + orgname;

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

    // Load the organization.
    loadOrganization();
  }
})();