(function () {
  angular.module('mCord')
  .service('Profile', function($injector, $resource, $q, $http, baseUrl){
    const r = $resource(`${baseUrl}onos/progran/profile/:id`, {id: '@Name'}, {
      save: {
        method: 'PUT'
      },
      $save: {
        method: 'PUT'
      },
      query: {
        array: false,
        interceptor: {
          response: function(res){
            const Profile = $injector.get('Profile');
            return res.data.ProfileArray.map(p => new Profile(p));
          }
        }
      },
      get: {
        array: false,
        interceptor: {
          response: function(res){
            const Profile = $injector.get('Profile');
            return new Profile(res.data.ProfileArray[0]);
          }
        }
      }
    });

    // Override the default save method,
    // Name is the key, so the $resource will try to update
    r.save = function(data){
      const d = $q.defer();
      $http.post(`${baseUrl}onos/progran/profile/`, data)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });
      return {$promise: d.promise};
    };

    r.prototype.getImsis = function(){
      const d = $q.defer();

      $http.get(`${baseUrl}onos/progran/profile/${this.Name}/imsi`)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });

      return d.promise;
    };

    // this is under profile
    r.prototype.addImsi = function(data){
      const d = $q.defer();
      let body = {'IMSIRuleArray': [data.IMSI]};
      $http.post(`${baseUrl}onos/progran/profile/${this.Name}/imsi`, body)
        .then(res => {
          d.resolve(res.data);
        })
        .catch(err => {
          d.reject(err)
        });

      return d.promise;
    };

    r.prototype.deleteImsis = function(){
      const d = $q.defer();

      $http.delete(`${baseUrl}onos/progran/profile/${this.Name}/imsi`)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });

      return d.promise;
    };

    r.prototype.deleteImsi = function(id){
      const d = $q.defer();

      $http.delete(`${baseUrl}onos/progran/profile/${this.Name}/imsi/${id}`)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });

      return d.promise;
    };

    r.prototype.getEnodes = function(){
      const d = $q.defer();

      $http.get(`${baseUrl}onos/progran/profile/${this.Name}/enodeb`)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });

      return d.promise;
    };

    r.prototype.deleteEnodes = function(){
      const d = $q.defer();

      $http.delete(`${baseUrl}onos/progran/profile/${this.Name}/enodeb`)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });

      return d.promise;
    };

    r.prototype.deleteEnode = function(id){
      const d = $q.defer();

      $http.delete(`${baseUrl}onos/progran/enodeb/${id}/profile/${this.Name}`)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });

      return d.promise;
    };

    return r;
  })
})();