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

/*
 * Licensed under the Apache License, Version 2.0
 * See accompanying LICENSE file.
 */

angular.module('dashboard')

  .factory('$visNetworkStyle', function () {
    'use strict';

    var fontFace = 'lato,roboto,"helvetica neue","segoe ui",arial,helvetica,sans-serif';
    var maxNodeRadius = 16;

    var self = {
      newOptions: function (height) {
        return {
          autoResize: true, // The network will automatically detect size changes and redraw itself accordingly
          interaction: {
            hover: true
          },
          width: '100%',
          height: height,
          nodes: {
            shape: 'dot',
            font: {
              size: 13,
              face: fontFace,
              strokeColor: '#fff',
              strokeWidth: 5
            }
          },
          edges: {
            arrows: {
              to: true
            },
            font: {
              size: 11,
              face: fontFace,
              align: 'middle'
            },
            color: {
              opacity: 0.75
            },
            smooth: true
          }
        };
      },
      newHierarchicalLayoutOptions: function (flags) {
        var verticalMargin = 28;
        var levelDistance = 85;
        var chartMinHeight = 240;
        var height = Math.max(chartMinHeight,
            (maxNodeRadius * (flags.depth + 1) + levelDistance * flags.depth + verticalMargin * 2)) + 'px';
        return angular.merge(self.newOptions(height), {
          layout: {
            hierarchical: {
              sortMethod: 'hubsize',
              direction: 'UD',
              levelSeparation: levelDistance
            }
          }
        });
      },
      newData: function () {
        return {
          nodes: new vis.DataSet(),
          edges: new vis.DataSet()
        };
      },
      nodeRadiusRange: function () {
        return [3, 16];
      },
      nodeColor: function (concern) {
        var colorSet = concern ? {
          border: 'rgb(138,1,12)',
          background: 'rgb(248,106,91)'
        } : {
          border: '#2B7CE9',
          background: '#D2E5FF'
        };
        var result = colorSet;
        if (concern) {
          result.hover = colorSet;
          result.highlight = colorSet;
        }
        return result;
      },
      edgeWidthRange: function () {
        return [1, 5];
      },
      edgeArrowSizeRange: function () {
        return [0.5, 0.1];
      },
      edgeOpacityRange: function () {
        return [0.4, 1];
      },
      edgeColorSet: function (alive) {
        return alive ? {
          color: '#2B7CE9',
          hover: '#2B7CE9',
          highlight: '#2B7CE9'
        } : {
          color: 'rgb(195,195,195)',
          hover: 'rgb(166,166,166)',
          highlight: 'rgb(166,166,166)'
        };
      },
      /** Return label of processor name */
      processorNameAsLabel: function (processor) {
        return '[' + processor.id + '] ' +
          (processor.description || _.last(processor.taskClass.split('.')));
      }
    };
    return self;
  })
;
