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

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

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

      return d.promise;
    };

    r.prototype.getStats = function(){
      const d = $q.defer();
      $http.get(`${baseUrl}onos/progran/stats/enodeb/${this.eNBId}/10`)
      .then(res => {
        d.resolve(res.data);
      })
      .catch(err => {
        d.reject(err)
      });

      return d.promise;
    };

    return r;
  })
})();