
/*
 * Copyright 2017-present Open Networking Foundation

 * Licensed 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.
 */


(function() {
  'use strict';

  /**
  * @ngdoc service
  * @name xos.helpers.ServiceGraph
  * @description This factory define a set of helper function to query the service tenancy graph
  **/

  angular
  .module('xos.helpers')
  .service('GraphService', function($q, Tenants, Services) {

    this.loadCoarseData = () => {

      let services;

      let deferred = $q.defer();

      Services.query().$promise
      .then((res) => {
        services = res;
        return Tenants.query({kind: 'coarse'}).$promise;
      })
      .then((tenants) => {
        deferred.resolve({
          tenants: tenants,
          services: services
        });
      })

      return deferred.promise;
    }

    this.getCoarseGraph = () => {
      this.loadCoarseData()
      .then((res) => {
        console.log(res);
      })
      return 'ciao';
    };

  })
})();
