/**
 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';

AppServices.Services.factory('ug', function (configuration, $rootScope,utility, $q, $http, $resource, $log, $analytics,$location) {

  var requestTimes = [],
    running = false,
    currentRequests = {};

  function reportError(data,config){
    try {
      $analytics.eventTrack('error', {
        category: 'App Services', label: data + ':' + config.url + ':' + (sessionStorage['apigee_uuid'] || 'na')
      });
    } catch (e) {
      console.log(e)
    }
  };
  var getAccessToken = function(){
    return sessionStorage.getItem('accessToken');
  };

  return {
    get:function(prop,isObject){
      return isObject ? this.client().getObject(prop) : this.client().get(prop);
    },
    set:function(prop,value){
      this.client().set(prop,value);

    },
    getUrls: function(qs){
      var host = $location.host();
      var BASE_URL = '';
      var DATA_URL = '';
      var use_sso = false;
      switch (true) {
        case host === 'appservices.apigee.com' && location.pathname.indexOf('/dit') >= 0 :
          //DIT
          BASE_URL = 'https://accounts.jupiter.apigee.net';
          DATA_URL = 'https://apigee-internal-prod.jupiter.apigee.net';
          use_sso = true;
          break;
        case host === 'appservices.apigee.com' && location.pathname.indexOf('/mars') >= 0  :
          //staging
          BASE_URL = 'https://accounts.mars.apigee.net';
          DATA_URL = 'https://apigee-internal-prod.mars.apigee.net';
          use_sso = true;
          break;
        case host === 'appservices.apigee.com' :
          //enterprise portals
          DATA_URL = Usergrid.overrideUrl;
          break;
        case host === 'apigee.com' :
          //prod
          BASE_URL = 'https://accounts.apigee.com';
          DATA_URL = 'https://api.usergrid.com';
          use_sso = true;
          break;
        case host === 'usergrid.dev':
          //development
          DATA_URL = 'https://api.usergrid.com';
          break;
        default :
          DATA_URL = Usergrid.overrideUrl;
          break;
      }
      //override with querystring
      DATA_URL = qs.api_url || DATA_URL;
      DATA_URL = DATA_URL.lastIndexOf('/') === DATA_URL.length - 1 ? DATA_URL.substring(0,DATA_URL.length-1) : DATA_URL;
      return {
        DATA_URL: DATA_URL,
        LOGIN_URL: BASE_URL + '/accounts/sign_in',
        PROFILE_URL: BASE_URL + '/accounts/my_account',
        LOGOUT_URL: BASE_URL + '/accounts/sign_out',
        apiUrl: DATA_URL,
        use_sso:use_sso
      };
    },
    orgLogin:function(username,password){
      var self = this;
      this.client().set('email', username);
      this.client().set('token', null);
      this.client().orgLogin(username,password,function(err, data, user, organizations, applications){
        if(err){
          $rootScope.$broadcast('loginFailed', err,data);
        }else{
          self.initializeCurrentUser(function () {
            $rootScope.$broadcast('loginSuccesful', user, organizations, applications);
          });
        }
      });
    },
    checkAuthentication:function(force){
      var ug = this;
      var client = ug.client();

      var initialize = function () {
            ug.initializeCurrentUser(function () {
              $rootScope.userEmail = client.get('email');
              $rootScope.organizations = client.getObject('organizations');
              $rootScope.applications = client.getObject('applications');
              $rootScope.currentOrg = client.get('orgName');
              $rootScope.currentApp = client.get('appName');
              var size = 0, key;
              for (key in  $rootScope.applications) {
                if ($rootScope.applications.hasOwnProperty(key)) size++;
              }
              $rootScope.$broadcast('checkAuthentication-success', client.getObject('organizations'), client.getObject('applications'), client.get('orgName'), client.get('appName'), client.get('email'));
            });
          },
          isAuthenticated = function () {
            var authenticated = client.get('token') !== null && client.get('organizations') !== null;
            if (authenticated) {
              initialize();
            }
            return authenticated;
          };
      if(!isAuthenticated() || force){
        if(!client.get('token')){
          return $rootScope.$broadcast('checkAuthentication-error','no token',{},client.get('email'));
        }
        this.client().reAuthenticateLite(function(err){
          var missingData = err || ( !client.get('orgName') || !client.get('appName') || !client.getObject('organizations') || !client.getObject('applications'));
          var email  = client.get('email');
          if(err || missingData){
            $rootScope.$broadcast('checkAuthentication-error',err,missingData,email);
          }else{
            initialize();
          }
        });
      }
    },
    reAuthenticate:function(email,eventOveride){
      var ug = this;
      this.client().reAuthenticate(email,function(err, data, user, organizations, applications){
        if(!err){
          $rootScope.currentUser = user;
        }
        if(!err){
          $rootScope.userEmail = user.get('email');
          $rootScope.organizations = organizations;
          $rootScope.applications = applications;
          $rootScope.currentOrg = ug.get('orgName');
          $rootScope.currentApp = ug.get('appName');
          $rootScope.currentUser = user._data;
          $rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
        }
        $rootScope.$broadcast((eventOveride || 'reAuthenticate')+'-' + (err ? 'error' : 'success'),err, data, user, organizations, applications);

      });
    },
    logoutCallback: function() {
      $rootScope.$broadcast('userNotAuthenticated');
    },
    logout:function(){
      $rootScope.activeUI = false;
      $rootScope.userEmail = 'user@apigee.com';
      $rootScope.organizations = {"noOrg":{name:"No Orgs Found"}};
      $rootScope.applications = {"noApp":{name:"No Apps Found"}};
      $rootScope.currentOrg = 'No Org Found';
      $rootScope.currentApp = 'No App Found';
      sessionStorage.setItem('accessToken', null);
      sessionStorage.setItem('userUUID', null);
      sessionStorage.setItem('userEmail', null);

      this.client().logout();
      this._client = null;
    },
    client: function(){
      var options = {
        buildCurl:true,
        logging:true
      };
      if(Usergrid.options && Usergrid.options.client){
        options.keys = Usergrid.options.client;
      }

      this._client = this._client || new Usergrid.Client(options,
          $rootScope.urls().DATA_URL
      );
      return this._client;
    },
    setClientProperty:function(key,value){
      this.client().set(key, value);
    },
    getTopCollections: function () {
      var options = {
        method:'GET',
        endpoint: ''
      }
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error getting collections');
        } else {
          var collections = data.entities[0].metadata.collections;
          $rootScope.$broadcast('top-collections-received', collections);
        }
      });
    },
    createCollection: function (collectionName) {
      var collections = {};
      collections[collectionName] = {};
      var metadata = {
        metadata: {
          collections: collections
        }
      }
      var options = {
        method:'PUT',
        body: metadata,
        endpoint: ''
      }
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error creating collection');
        } else {
          $rootScope.$broadcast('collection-created', collections);
        }
      });
    },
    getApplications: function () {
      this.client().getApplications(function (err, applications) {
        if (err) {
           applications && console.error(applications);
        }else{
          $rootScope.$broadcast('applications-received', applications);
        }
      });
    },
    getAdministrators: function () {
      this.client().getAdministrators(function (err, administrators) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error getting administrators');
        }
        $rootScope.$broadcast('administrators-received', administrators);
      });
    },
    createApplication: function (appName) {
      this.client().createApplication(appName, function (err, applications) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error creating application');
        }else{
          $rootScope.$broadcast('applications-created', applications,appName);
          $rootScope.$broadcast('applications-received', applications);
        }
      });
    },
    createAdministrator: function (adminName) {
      this.client().createAdministrator(adminName, function (err, administrators) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error creating administrator');
        }
        $rootScope.$broadcast('administrators-received', administrators);
      });
    },
    getFeed: function () {
      var options = {
        method:'GET',
        endpoint:'management/organizations/'+this.client().get('orgName')+'/feed',
        mQuery:true
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error getting feed');
        } else {
          var feedData = data.entities;
          var feed = [];
          var i=0;
          for (i=0; i < feedData.length; i++) {
            var date = (new Date(feedData[i].created)).toUTCString();

            var title = feedData[i].title;

            var n=title.indexOf(">");
            title = title.substring(n+1,title.length);

            n=title.indexOf(">");
            title = title.substring(n+1,title.length);

            if (feedData[i].actor) {
              title = feedData[i].actor.displayName + ' ' + title;
            }
            feed.push({date:date, title:title});
          }
          if (i === 0) {
            feed.push({date:"", title:"No Activities found."});
          }

          $rootScope.$broadcast('feed-received', feed);
        }
      });

    },
    createGroup: function (path, title) {
      var options = {
        path:path,
        title:title
      }
      var self = this;
      this.groupsCollection.addEntity(options, function(err){
        if (err) {
          $rootScope.$broadcast('groups-create-error', err);
        } else {
          $rootScope.$broadcast('groups-create-success', self.groupsCollection);
          $rootScope.$broadcast('groups-received', self.groupsCollection);
        }
      });
    },
    createRole: function (name, title) {
      var options = {
        name:name,
        title:title
          },
          self = this;
      this.rolesCollection.addEntity(options, function(err){
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error creating role');
        } else {
          $rootScope.$broadcast('roles-received', self.rolesCollection);
        }
      });
    },
    createUser: function (username, name, email, password){
      var options = {
        username:username,
        name:name,
        email:email,
        password:password
      }
      var self = this;
      this.usersCollection.addEntity(options, function(err, data){
        if (err) {
          if (typeof data === 'string') {
            $rootScope.$broadcast("alert", "error", "error: " + data);
          } else {
            $rootScope.$broadcast("alert", "error", "error creating user. the email address might already exist.");
          }
        } else {
          $rootScope.$broadcast('users-create-success', self.usersCollection);

          $rootScope.$broadcast('users-received', self.usersCollection);
        }
      });
    },
    getCollection: function (type, path, orderBy, query, limit) {
      var options = {
        type:path,
        qs:{}
      }
      if (query) {
        options.qs['ql'] = query;
      }

      //force order by 'created desc' if none exists
      if (options.qs.ql) {
        options.qs['ql'] = options.qs.ql + ' order by ' + (orderBy || 'created desc');
      } else {
        options.qs['ql'] = ' order by ' + (orderBy || 'created desc');
      }

      if (limit) {
        options.qs['limit'] = limit;
      }
      this.client().createCollection(options, function (err, collection, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error getting ' + collection._type + ': ' + data.error_description);
          $rootScope.$broadcast(type + '-error', collection);
        } else {
          $rootScope.$broadcast(type + '-received', collection);
        }
        //temporarily adding scope.apply to get working in prod, otherwise the events won't get broadcast
        //todo - we need an apply strategy for 3rd party ug calls!
        if(!$rootScope.$$phase) {
          $rootScope.$apply();
        }
      });
    },
    runDataQuery: function (queryPath, searchString, queryLimit) {
      this.getCollection('query', queryPath, null, searchString, queryLimit);
    },
    runDataPOSTQuery: function(queryPath, body) {
      var self = this;
      var options = {
        method:'POST',
        endpoint:queryPath,
        body:body
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error: ' + data.error_description);
          $rootScope.$broadcast('error-running-query',  data);
        } else {

          var queryPath = data.path;
          self.getCollection('query', queryPath, null, 'order by modified DESC', null);

        }
      });
    },
    runDataPutQuery: function(queryPath, searchString, queryLimit, body) {
      var self = this;
      var options = {
        method:'PUT',
        endpoint:queryPath,
        body:body
      };

      if (searchString) {
        options.qs['ql'] = searchString;
      }
      if (queryLimit) {
        options.qs['queryLimit'] = queryLimit;
      }

      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error: ' + data.error_description);
        } else {

          var queryPath = data.path;
          self.getCollection('query', queryPath, null, 'order by modified DESC', null);

        }
      });
    },
    runDataDeleteQuery: function(queryPath, searchString, queryLimit) {
      var self = this;
      var options = {
        method:'DELETE',
        endpoint:queryPath
      };

      if (searchString) {
        options.qs['ql'] = searchString;
      }
      if (queryLimit) {
        options.qs['queryLimit'] = queryLimit;
      }

      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error: ' + data.error_description);
        } else {

          var queryPath = data.path;
          self.getCollection('query', queryPath, null, 'order by modified DESC', null);

        }
      });
    },
    getUsers: function () {
      this.getCollection('users','users','username');
      var self = this;
      $rootScope.$on("users-received",function(evt, users){
        self.usersCollection = users;
      })
    },
    getGroups: function () {
      this.getCollection('groups','groups','title');
      var self = this;
      $rootScope.$on('groups-received', function(event, roles) {
        self.groupsCollection = roles;
      });

     },
    getRoles: function () {
      this.getCollection('roles','roles','name');
      var self = this;
      $rootScope.$on('roles-received', function(event, roles) {
        self.rolesCollection = roles
      });
    },
    getNotifiers: function () {
      var query = '',
          limit = '100',
          self = this;
      this.getCollection('notifiers','notifiers','created', query, limit);
      $rootScope.$on('notifiers-received', function(event, notifiers) {
        self.notifiersCollection = notifiers;
      });
    },
    getNotificationHistory: function (type) {
      var query = null;
      if (type) {
        query = "select * where state = '" + type + "'";
      }
      this.getCollection('notifications','notifications', 'created desc', query);
      var self = this;
      $rootScope.$on('notifications-received', function(event, notifications) {
        self.notificationCollection = notifications;
      });
    },
    getNotificationReceipts: function (uuid) {
      this.getCollection('receipts', 'notifications/'+uuid+'/receipts');
      var self = this;
      $rootScope.$on('receipts-received', function(event, receipts) {
        self.receiptsCollection = receipts;
      });
    },
    getIndexes: function (path) {
      var options = {
        method:'GET',
        endpoint: path.split('/').concat('indexes').filter(function(bit){return bit && bit.length}).join('/')
      }
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'Problem getting indexes: ' + data.error);
        } else {
          $rootScope.$broadcast('indexes-received', data.data);
        }
      });
    },
    sendNotification: function(path, body) {
      var options = {
        method:'POST',
        endpoint: path,
        body:body
      }
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'Problem creating notification: ' + data.error);
        } else {
          $rootScope.$broadcast('send-notification-complete');
        }
      });
    },
    getRolesUsers: function (username) {
      var self = this;
      var options = {
        type:'roles/users/'+username,
        qs:{ql:'order by username'}
      }
      this.client().createCollection(options, function (err, users) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error getting users');
        } else {
          $rootScope.$broadcast('users-received', users);

        }
      });
    },
    getTypeAheadData: function (type, searchString, searchBy, orderBy) {

      var self = this;
      var search = '';
      var qs = {limit: 100};
      if (searchString) {
        search = "select * where "+searchBy+" = '"+searchString+"'";
      }
      if (orderBy) {
        search = search + " order by "+orderBy;
      }
      if (search) {
        qs.ql = search;
      }
      var options = {
        method:'GET',
        endpoint: type,
        qs:qs
      }
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error getting '+type);
        } else {
          var entities = data.entities;
          $rootScope.$broadcast(type +'-typeahead-received', entities);
        }
      });
    },
    getUsersTypeAhead: function (searchString) {
      this.getTypeAheadData('users', searchString, 'username', 'username');
    },
    getGroupsTypeAhead: function (searchString) {
      this.getTypeAheadData('groups', searchString, 'path', 'path');
    },
    getRolesTypeAhead: function (searchString) {
      this.getTypeAheadData('roles', searchString, 'name', 'name');
    },
    getGroupsForUser: function (user) {
      var self = this;
      var options = {
        type:'users/'+user+'/groups'
      }
      this.client().createCollection(options, function (err, groups) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error getting groups');
        } else {

          $rootScope.$broadcast('user-groups-received', groups);

        }
      });
    },
    addUserToGroup: function (user, group) {
      var self = this;
      var options = {
        type:'users/'+user+'/groups/'+group
      }
      this.client().createEntity(options, function (err, entity) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error adding user to group');
        } else {
          $rootScope.$broadcast('user-added-to-group-received');
        }
      });
    },
    addUserToRole: function (user, role) {
      var options = {
        method:'POST',
        endpoint:'roles/'+role+'/users/'+user
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error adding user to role');
        } else {
          $rootScope.$broadcast('role-update-received');
        }
      });
    },
    addGroupToRole: function (group, role) {
      var options = {
        method:'POST',
        endpoint:'roles/'+role+'/groups/'+group
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error adding group to role');
        } else {
          $rootScope.$broadcast('role-update-received');
        }
      });
    },
    followUser: function (user) {
      var self = this;
      var username =  $rootScope.selectedUser.get('uuid');
      var options = {
        method:'POST',
        endpoint:'users/'+username+'/following/users/'+user
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error following user');
        } else {
          $rootScope.$broadcast('follow-user-received');
        }
      });
    },
    newPermission: function (permission, type, entity) { //"get,post,put:/mypermission"
      var options = {
        method:'POST',
        endpoint:type+'/'+entity+'/permissions',
        body:{"permission":permission}
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error adding permission');
        } else {
          $rootScope.$broadcast('permission-update-received');
        }
      });
    },
    newUserPermission: function (permission, username) {
      this.newPermission(permission,'users',username)
    },
    newGroupPermission: function (permission, path) {
      this.newPermission(permission,'groups',path)
    },
    newRolePermission: function (permission, name) {
      this.newPermission(permission,'roles',name)
    },

    deletePermission: function (permission, type, entity) { //"get,post,put:/mypermission"
      var options = {
        method:'DELETE',
        endpoint:type+'/'+entity+'/permissions',
        qs:{permission:permission}
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error deleting permission');
        } else {
          $rootScope.$broadcast('permission-update-received');
        }
      });
    },
    deleteUserPermission: function (permission, user) {
      this.deletePermission(permission,'users',user);
    },
    deleteGroupPermission: function (permission, group) {
      this.deletePermission(permission,'groups',group);
    },
    deleteRolePermission: function (permission, rolename) {
      this.deletePermission(permission,'roles',rolename);
    },
    removeUserFromRole: function (user, role) { //"get,post,put:/mypermission"
      var options = {
        method:'DELETE',
        endpoint:'roles/'+role+'/users/'+user
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error removing user from role');
        } else {
          $rootScope.$broadcast('role-update-received');
        }
      });
    },
    removeUserFromGroup: function (group, role) { //"get,post,put:/mypermission"
      var options = {
        method:'DELETE',
        endpoint:'roles/'+role+'/groups/'+group
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error removing role from the group');
        } else {
          $rootScope.$broadcast('role-update-received');
        }
      });
    },
    createAndroidNotifier: function (name, APIkey) {
      var options = {
        method:'POST',
        endpoint:'notifiers',
        body:{"apiKey":APIkey,"name":name,"provider":"google"}
      };
      this.client().request(options, function (err, data) {
        if (err) {
          console.error(data);
          $rootScope.$broadcast('alert', 'error', 'error creating notifier ');
        } else {
          $rootScope.$broadcast('alert', 'success', 'New notifier created successfully.');
          $rootScope.$broadcast('notifier-update');
        }
      });

    },
    createAppleNotifier: function (file, name, environment, certificatePassword ) {

      var provider = 'apple';

      var formData = new FormData();
        formData.append("p12Certificate", file);

        formData.append('name', name);
        formData.append('provider', provider);
        formData.append('environment', environment);
        formData.append('certificatePassword', certificatePassword || "");
      //var body = {'p12Certificate':file, "name":name,'environment':environment,"provider":provider};
      //if(certificatePassword){
        //    body.certificatePassword = certificatePassword;
      //}
      var options = {
        method:'POST',
        endpoint:'notifiers',
        formData:formData
      };
      this.client().request(options, function (err, data) {
        if (err) {
          console.error(data);
          $rootScope.$broadcast('alert', 'error', data.error_description  || 'error creating notifier');
        } else {
          $rootScope.$broadcast('alert', 'success', 'New notifier created successfully.');
          $rootScope.$broadcast('notifier-update');
        }
      });

    },
    deleteNotifier: function (name) {
      var options = {
        method:'DELETE',
        endpoint: 'notifiers/'+name
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'error deleting notifier');
        } else {
          $rootScope.$broadcast('notifier-update');
        }
      });

    },
    initializeCurrentUser: function (callback) {
      callback = callback || function(){};
      if($rootScope.currentUser && !$rootScope.currentUser.reset){
        callback($rootScope.currentUser);
        return $rootScope.$broadcast('current-user-initialized', '');
      }
      var options = {
        method:'GET',
        endpoint:'management/users/'+ this.client().get('email'),
        mQuery:true
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('alert', 'error', 'Error getting user info');
        } else {
          $rootScope.currentUser = data.data;
          $rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
          $rootScope.userEmail =$rootScope.currentUser.email;
          callback($rootScope.currentUser);
          $rootScope.$broadcast('current-user-initialized', $rootScope.currentUser);
        }
      });
    },

    updateUser: function (user) {
      var body = $rootScope.currentUser;
      body.username = user.username;
      body.name = user.name;
      body.email = user.email;
      var options = {
        method:'PUT',
        endpoint:'management/users/' + user.uuid + '/',
        mQuery:true,
        body:body
      };
      var self = this;
      this.client().request(options, function (err, data) {
        self.client().set('email',user.email);
        self.client().set('username',user.username);
        if (err) {
          return $rootScope.$broadcast('user-update-error',data);
        }
        $rootScope.currentUser.reset = true;
        self.initializeCurrentUser(function(){
          $rootScope.$broadcast('user-update-success', $rootScope.currentUser);
        });
      });
    },

    resetUserPassword: function (user) {
      var pwdata = {};
      pwdata.oldpassword = user.oldPassword;
      pwdata.newpassword = user.newPassword;
      pwdata.username = user.username;
      var options = {
        method:'PUT',
        endpoint:'users/' + pwdata.uuid + '/',
        body:pwdata
      }
      this.client().request(options, function (err, data) {
        if (err) {
         return  $rootScope.$broadcast('alert', 'error', 'Error resetting password');
        }
        //remove old and new password fields so they don't end up as part of the entity object
        $rootScope.currentUser.oldPassword = '';
        $rootScope.currentUser.newPassword = '';
        $rootScope.$broadcast('user-reset-password-success', $rootScope.currentUser);
      });

    },
    getOrgCredentials: function () {
      var options = {
        method:'GET',
        endpoint:'management/organizations/'+this.client().get('orgName')+'/credentials',
        mQuery:true
      };
      this.client().request(options, function (err, data) {
        if (err && data.credentials) {
          $rootScope.$broadcast('alert', 'error', 'Error getting credentials');
        } else {
          $rootScope.$broadcast('org-creds-updated', data.credentials);
        }
      });
    },
    regenerateOrgCredentials: function () {
      var self = this;
      var options = {
        method:'POST',
        endpoint:'management/organizations/'+ this.client().get('orgName') + '/credentials',
        mQuery:true
      };
      this.client().request(options, function(err, data) {
        if (err && data.credentials) {
          $rootScope.$broadcast('alert', 'error', 'Error regenerating credentials');
        } else {
          $rootScope.$broadcast('alert', 'success', 'Regeneration of credentials complete.');
          $rootScope.$broadcast('org-creds-updated', data.credentials);
        }
      });
    },
    getAppCredentials: function () {
      var options = {
        method:'GET',
        endpoint:'credentials'
      };
      this.client().request(options, function (err, data) {
        if (err && data.credentials) {
          $rootScope.$broadcast('alert', 'error', 'Error getting credentials');
        } else {
          $rootScope.$broadcast('app-creds-updated', data.credentials);
        }
      });
    },

    regenerateAppCredentials: function () {
      var self = this;
      var options = {
        method:'POST',
        endpoint:'credentials'
      };
      this.client().request(options, function(err, data) {
        if (err && data.credentials) {
          $rootScope.$broadcast('alert', 'error', 'Error regenerating credentials');
        } else {
          $rootScope.$broadcast('alert', 'success', 'Regeneration of credentials complete.');
          $rootScope.$broadcast('app-creds-updated', data.credentials);
        }
      });
    },

    signUpUser: function(orgName,userName,name,email,password){
      var formData = {
        "organization": orgName,
        "username": userName,
        "name": name,
        "email": email,
        "password": password
      };
      var options = {
        method:'POST',
        endpoint:'management/organizations',
        body:formData,
        mQuery:true
      };
      var client = this.client();
      client.request(options, function(err, data) {
        if (err) {
          $rootScope.$broadcast('register-error', data);
        } else {
          $rootScope.$broadcast('register-success',data);
        }
      });
    },
    resendActivationLink: function(id){
      var options = {
        method: 'GET',
        endpoint: 'management/users/'+id+'/reactivate',
        mQuery:true
      };
      this.client().request(options, function (err, data) {
        if (err) {
          $rootScope.$broadcast('resend-activate-error', data);
        } else {
          $rootScope.$broadcast('resend-activate-success',data);
        }
      });
    },
    getAppSettings: function(){
      $rootScope.$broadcast('app-settings-received',{});
    },
    getActivities: function(){
        this.client().request({method:'GET',endpoint:'activities', qs:{limit:200}},function(err,data){
          if(err) return $rootScope.$broadcast('app-activities-error',data);
          var entities = data.entities;
          //set picture if there is none and change gravatar to secure
          entities.forEach(function(entity) {
            if (!entity.actor.picture) {
              entity.actor.picture = window.location.protocol+ "//" + window.location.host + window.location.pathname + "img/user_profile.png"
            } else {
              entity.actor.picture = entity.actor.picture.replace(/^http:\/\/www.gravatar/i, 'https://secure.gravatar');
              //note: changing this to use the image on apigee.com - since the gravatar default won't work on any non-public domains such as localhost
              //this_data.picture = this_data.picture + encodeURI("?d="+window.location.protocol+"//" + window.location.host + window.location.pathname + "images/user_profile.png");
              if (~entity.actor.picture.indexOf('http')) {
                entity.actor.picture = entity.actor.picture;
              } else {
                entity.actor.picture = 'https://apigee.com/usergrid/img/user_profile.png';
              }
            }
        });
          $rootScope.$broadcast('app-activities-received',data.entities);
        });
    },
    getEntityActivities: function(entity, isFeed){
        var route = isFeed ? 'feed' : 'activities'
        var endpoint = entity.get('type') + '/' + entity.get('uuid') + '/'+route ;
        var options = {
          method:'GET',
          endpoint:endpoint,
          qs:{limit:200}
        };
        this.client().request(options, function (err, data) {
          if(err){
            $rootScope.$broadcast(entity.get('type')+'-'+route+'-error',data);
          }
          data.entities.forEach(function(entityInstance) {
            entityInstance.createdDate = (new Date( entityInstance.created)).toUTCString();
          });
          $rootScope.$broadcast(entity.get('type')+'-'+route+'-received',data.entities);
        });
    },
    addUserActivity:function(user,content){
      var options = {
        "actor": {
        "displayName": user.get('username'),
        "uuid": user.get('uuid'),
        "username":user.get('username')
          },
        "verb": "post",
        "content": content
      };
      this.client().createUserActivity(user.get('username'), options, function(err, activity) { //first argument can be 'me', a uuid, or a username
        if (err) {
          $rootScope.$broadcast('user-activity-add-error', err);
        } else {
          $rootScope.$broadcast('user-activity-add-success', activity);
        }
      });
    },
    runShellQuery:function(method,path,payload){
      var path = path.replace(/^\//, ''); //remove leading slash if it does
      var options = {
        "method": method,
        "endpoint":path
      };
      if(payload){
        options["body"]=payload;
      }
      this.client().request(options,function(err,data){
        if(err) {
          $rootScope.$broadcast('shell-error', data);
        }else{
          $rootScope.$broadcast('shell-success', data);
        }
      });
    },
    addOrganization:function(user,orgName){
      var options = {
        method: 'POST',
        endpoint: 'management/users/'+user.uuid+'/organizations',
        body:{organization:orgName},
        mQuery:true
          }, client = this.client(),self=this;
      client.request(options,function(err,data){
        if(err){
          $rootScope.$broadcast('user-add-org-error', data);
        }else{
          $rootScope.$broadcast('user-add-org-success', $rootScope.organizations);
        }
      });
    },
    leaveOrganization:function(user,org){
      var options = {
        method: 'DELETE',
        endpoint: 'management/users/'+user.uuid+'/organizations/'+org.uuid,
        mQuery:true
      }
      this.client().request(options,function(err,data){
        if(err){
          $rootScope.$broadcast('user-leave-org-error', data);
        }else{
          delete  $rootScope.organizations[org.name];
          $rootScope.$broadcast('user-leave-org-success', $rootScope.organizations);
        }
      });
    },
    /**
     * Retrieves page data
     * @param {string} id the name of the single page item to get (a key in the JSON) can be null.
     * @param {string} url location of the file/endpoint.
     * @return {Promise} Resolves to JSON.
     */
    httpGet: function (id, url) {
      var items, deferred;

      deferred = $q.defer();

      $http.get((url || configuration.ITEMS_URL)).
        success(function (data, status, headers, config) {
          var result;
          if (id) {
            angular.forEach(data, function (obj, index) {
              if (obj.id === id) {
                result = obj;
              }
            });
          } else {
            result = data;
          }
          deferred.resolve(result);
        }).
        error(function (data, status, headers, config) {
          $log.error(data, status, headers, config);
          reportError(data,config);
          deferred.reject(data);
        });

      return deferred.promise;
    },

    /**
     * Retrieves page data via jsonp
     * @param {string} url the location of the JSON/RESTful endpoint.
     * @param {string} successCallback function called on success.
     */

    jsonp: function (objectType,criteriaId,params,successCallback) {
      if(!params){
        params = {};
      }
      params.demoApp = $rootScope.demoData;
      params.access_token = getAccessToken();
      params.callback = 'JSON_CALLBACK';
      var uri = $rootScope.urls().DATA_URL  + '/' + $rootScope.currentOrg + '/' + $rootScope.currentApp + '/apm/' + objectType + '/' + criteriaId;
      return this.jsonpRaw(objectType,criteriaId,params,uri,successCallback);
    },

    jsonpSimple: function (objectType,appId,params) {
      var uri = $rootScope.urls().DATA_URL  + '/' + $rootScope.currentOrg + '/' + $rootScope.currentApp + '/apm/' + objectType + "/" + appId;
      return this.jsonpRaw(objectType,appId,params,uri);
    },
    calculateAverageRequestTimes: function(){
      if(!running){
        var self = this;
        running = true;
        setTimeout(function(){
          running=false;
          var length = requestTimes.length < 10 ? requestTimes.length  : 10;
          var sum = requestTimes.slice(0, length).reduce(function(a, b) { return a + b });
          var avg = sum / length;
          self.averageRequestTimes = avg/1000;
          if(self.averageRequestTimes > 5){
            $rootScope.$broadcast('request-times-slow',self.averageRequestTimes);
          }
        },3000);
      }
    },
    jsonpRaw: function (objectType,appId,params,uri,successCallback) {
      if(typeof successCallback !== 'function'){
        successCallback = null;
      }
      uri = uri || ($rootScope.urls().DATA_URL  + '/' + $rootScope.currentOrg + '/' + $rootScope.currentApp + '/' + objectType);

      if(!params){
        params = {};
      }

      var start = new Date().getTime(),
        self = this;

      params.access_token = getAccessToken();
      params.callback = 'JSON_CALLBACK';

      var deferred = $q.defer();

      var diff = function(){
        currentRequests[uri]--;
        requestTimes.splice(0,0 ,new Date().getTime() - start);
        self.calculateAverageRequestTimes();
      };

      successCallback && $rootScope.$broadcast("ajax_loading", objectType);
      var reqCount = currentRequests[uri] || 0;
      if(self.averageRequestTimes > 5 && reqCount>1){
        setTimeout(function(){
          deferred.reject(new Error('query in progress'));
        },50);
        return deferred;
      }
      currentRequests[uri] = (currentRequests[uri] || 0) + 1;

      $http.jsonp(uri,{params:params}).
        success(function(data, status, headers, config) {
          diff();
          if(successCallback){
            successCallback(data, status, headers, config);
            $rootScope.$broadcast("ajax_finished", objectType);
          }
          deferred.resolve(data);
        }).
        error(function(data, status, headers, config) {
          diff();
          $log.error("ERROR: Could not get jsonp data. " +uri);
          reportError(data,config);
          deferred.reject(data);
        });

      return deferred.promise;
    },

    resource: function(params,isArray) {
      //temporary url for REST endpoints

      return $resource($rootScope.urls().DATA_URL + '/:orgname/:appname/:username/:endpoint',
        {

        },
        {
          get: {
            method:'JSONP',
            isArray: isArray,
            params: params
          },
          login: {
            method:'GET',
            url: $rootScope.urls().DATA_URL + '/management/token',
            isArray: false,
            params: params
          },
          save: {
            url: $rootScope.urls().DATA_URL + '/' + params.orgname + '/' + params.appname,
            method:'PUT',
            isArray: false,
            params: params
          }
        });
    },

    httpPost: function(url,callback,payload,headers){

      var accessToken = getAccessToken();

      if(payload){
        payload.access_token = accessToken;
      }else{
        payload = {access_token:accessToken}
      }

      if(!headers){
        headers = {Bearer:accessToken};
      }

      $http({method: 'POST', url: url, data: payload, headers: headers}).
        success(function(data, status, headers, config) {
          callback(data)
        }).
        error(function(data, status, headers, config) {
          reportError(data,config);
          callback(data)
        });

    }
  }
});
