text: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  'use strict';
  
  angular.module('ambariAdminConsole')
  .factory('Group', ['$http', '$q', 'Settings', 'GroupConstants', '$translate', function($http, $q, Settings, GroupConstants, $translate) {
    var $t = $translate.instant;
    function Group(item){
      if(typeof item === 'string'){
        this.group_name = item;
      } else if(typeof item === 'object'){
        angular.extend(this, item.Groups);
        this.getMembers();
      }
    }
  
    Group.prototype.isLDAP = function() {
      var deferred = $q.defer();
      var self = this;
      if( typeof this.ldap_group === 'boolean' ){
        deferred.resolve(this.ldap_group)
      } else {
        $http({
          method: 'GET',
          url: Settings.baseUrl + '/groups/'+this.group_name
        }).
        success(function(data) {
          self.ldap_group = data.Groups.ldap_group;
          deferred.resolve(self.ldap_group);
        });
      }
  
      return deferred.promise;
    }
  
    Group.prototype.getGroupType = function() {
      var deferred = $q.defer();
      var self = this;
      $http({
        method: 'GET',
        url: Settings.baseUrl + '/groups/'+this.group_name
      }).
      success(function(data) {
        self.group_type = data.Groups.group_type;
        deferred.resolve(self.group_type);
      });
  
      return deferred.promise;
    }
  
    Group.prototype.save = function() {
      return $http({
        method : 'POST',
        url: Settings.baseUrl + '/groups',
        data:{
          'Groups/group_name': this.group_name
        }
      });
    };
  
    Group.prototype.destroy = function() {
      var deferred = $q.defer();
      $http.delete(Settings.baseUrl + '/groups/' +this.group_name)
      .success(function() {
        deferred.resolve();
      })
      .error(function(data) {
        deferred.reject(data);
      });
  
      return deferred.promise;
    };
  
    Group.prototype.getMembers = function() {
      var deferred = $q.defer();
      var self = this;
  
      $http({
        method: 'GET',
        url: Settings.baseUrl + '/groups/' + this.group_name + '/members'
      })
      .success(function(data) {
        self.members = [];
        angular.forEach(data.items, function(member) {
          self.members.push(member.MemberInfo.user_name);
        });
        deferred.resolve(self.members);
      })
      .error(function(data) {
        deferred.reject(data);
      });
  
      return deferred.promise;
    };
  
    Group.prototype.saveMembers = function() {
      var self = this;
      var deferred = $q.defer();
  
      var members = [];
      angular.forEach(this.members, function(member) {
        members.push({
          'MemberInfo/user_name' : member,
          'MemberInfo/group_name' : self.group_name
        });
      });
  
      $http({
        method: 'PUT',
        url: Settings.baseUrl + '/groups/' + this.group_name + '/members',
        data: members
      })
      .success(function(data) {
        deferred.resolve(data);
      })
      .error(function(data) {
        deferred.reject(data);
      });
      return deferred.promise;
    }
  
    Group.prototype.addMember = function(memberName) {
      var deferred = $q.defer();
  
      $http({
        method: 'POST',
        url: Settings.baseUrl + '/groups/' + this.group_name + '/members' + '/'+ encodeURIComponent(member.user_name)
      })
      .success(function(data) {
        deferred.resolve(data)
      })
      .error(function(data) {
        deferred.reject(data);
      });
  
      return deferred.promise;
    };
  
    Group.prototype.removeMember = function(memberId) {
      return $http.delete(Settings.baseUrl + '/groups/'+this.group_name+'/members/'+memberId);
    };
  
    Group.removeMemberFromGroup = function(groupName, memberName) {
      return $http.delete(Settings.baseUrl + '/groups/'+groupName + '/members/'+memberName);
    };
  
    Group.addMemberToGroup = function(groupName, memberName) {
      return $http.post(Settings.baseUrl + '/groups/' + groupName + '/members/'+memberName);
    };
  
    Group.all = function(params) {
      var deferred = $q.defer();
  
      $http.get(Settings.baseUrl + '/groups?'
        + 'Groups/group_name.matches(.*'+params.searchString+'.*)'
        + '&fields=*'
        + '&from='+ (params.currentPage-1)*params.groupsPerPage
        + '&page_size=' + params.groupsPerPage
        + (params.group_type === '*' ? '' : '&Groups/group_type=' + params.group_type)
      )
      .success(function(data) {
        var groups = [];
        if(Array.isArray(data.items)){
          angular.forEach(data.items, function(item) {
            groups.push(new Group(item));
          });
        }
        groups.itemTotal = data.itemTotal;
        deferred.resolve(groups);
      })
      .error(function(data) {
        deferred.reject(data);
      });
  
      return deferred.promise;
    };
  
    Group.listByName = function(name) {
      return $http.get(Settings.baseUrl + '/groups?'
        + 'Groups/group_name.matches(.*'+name+'.*)'
      );
    };
  
    Group.getPrivileges = function(groupId) {
      return $http.get(Settings.baseUrl + '/groups/' + groupId + '/privileges', {
        params:{
          'fields': '*'
        }
      });
    };
  
    /**
       * Generate group info to display by response data from API.
       * Generally this is a single point to manage all required and useful data
       * needed to use as context for views/controllers.
       *
       * @param {Object} group - object from API response
       * @returns {Object}
       */
     Group.makeGroup = function(group) {
        group.groupTypeName = $t(GroupConstants.TYPES[group.group_type].LABEL_KEY);
        return group;
    };
  
    return Group;
  }]);
  