
/*
 * 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';
  angular.module('xos.diagnostic')
  .directive('logicTopology', function(){
    return {
      restrict: 'E',
      scope: {
        subscribers: '=',
        selected: '='
      },
      bindToController: true,
      controllerAs: 'vm',
      templateUrl: 'templates/logicTopology.tpl.html',
      controller: function($element, $log, $scope, $rootScope, $timeout, d3, LogicTopologyHelper, Node, Tenant, Ceilometer, serviceTopologyConfig, ChartData){
        $log.info('Logic Plane');

        var svg;
        this.selectedInstances = [];
        this.hideInstanceStats = true;
        var _this = this;

        const handleSvg = (el) => {

          d3.select($element[0]).select('svg').remove();

          svg = d3.select(el)
          .append('svg')
          .style('width', `${el.clientWidth}px`)
          .style('height', `${el.clientHeight}px`);
        }

        const loadGlobalScope = () => {
          ChartData.getLogicTree()
          .then((tree) => {
            LogicTopologyHelper.updateTree(svg);
          });
        }
        loadGlobalScope();

        $scope.$watch(() => this.selected, (selected) => {
          if(selected){
            ChartData.selectSubscriber(selected);
            LogicTopologyHelper.updateTree(svg);
          }
          else{
            ChartData.removeSubscriber();
            LogicTopologyHelper.updateTree(svg);
          }
        });

        $rootScope.$on('instance.detail.hide', () => {
          this.hideInstanceStats = true;
          $timeout(() => {
            this.selectedInstances = [];
            ChartData.highlightInstances([]);
            LogicTopologyHelper.updateTree(svg);
          }, 500);
        });

        $rootScope.$on('instance.detail', (evt, service) => {
          ChartData.getInstanceStatus(service)
          .then((instances) => {
            LogicTopologyHelper.updateTree(svg);
          })
          .catch(e => {
            _this.error = 'Service statistics are not available at this time. Please try again later.'
            $timeout(() => {
              _this.error = null;
            }, 2000);
          })
        });

        d3.select(window)
        .on('resize.logic', () => {
          handleSvg($element[0]);
          LogicTopologyHelper.setupTree(svg);
          LogicTopologyHelper.updateTree(svg);
        });

        handleSvg($element[0]);
        LogicTopologyHelper.setupTree(svg);

        this.selectSubscriberModal = () => {
          this.openSelectSubscriberModal = true;
          $scope.$apply();
        };

        this.subscriberStatusModal = () => {
          this.openSubscriberStatusModal = true;
          $scope.$apply();
        };

        // listen for subscriber modal event
        // $rootScope.$on('subscriber.modal.open', () => {
        //
        //   if(ChartData.currentSubscriber){
        //     this.subscriberStatusModal();
        //   }
        //   else{
        //     this.selectSubscriberModal();
        //   }
        // });

        // listen for subscriber modal event
        $rootScope.$on('subscriber.modal.open', () => {
          if(ChartData.currentSubscriber){
            this.currentSubscriber = ChartData.currentSubscriber;
            this.subscriberStatusModal();
          }
          else{
            this.selectSubscriberModal();
          }
        });

      }
    };
  });
})();
