(function () {
  angular.module('xos.serviceTopology')
  .service('RackHelper', function(serviceTopologyConfig, lodash){

    this.getComputeNodeLabelSize = () => {
      return serviceTopologyConfig.computeNode.labelHeight + (serviceTopologyConfig.instance.margin * 2)
    }

    /**
    * Given a list of instance should get the Compute Node size.
    * They are placed in rows of 2 with 5px margin on each side.
    */
   
    this.getComputeNodeSize = lodash.memoize((instances) => {
      const width = (serviceTopologyConfig.instance.margin * 3) + (serviceTopologyConfig.instance.width *2);

      const rows = Math.round(instances.length / 2);

      const labelSpace = this.getComputeNodeLabelSize();

      const height = (serviceTopologyConfig.instance.height * rows) + (serviceTopologyConfig.instance.margin * (rows + 1)) + labelSpace;
      return [width, height];
    });

    /**
    * Give a list on Compute Node should calculate the Rack Size.
    * Compute nodes are placed in a single column with 5px margin on each side.
    */
    this.getRackSize = (nodes) => {

      let width = 0;
      let height = serviceTopologyConfig.computeNode.margin;

      lodash.forEach(nodes, (node) => {
        let [instanceWidth, instanceHeight] = this.getComputeNodeSize(node.instances);

        width = instanceWidth + (serviceTopologyConfig.computeNode.margin * 2);
        height += (instanceHeight + serviceTopologyConfig.computeNode.margin);
      });

      return [width, height];
    };

    /**
    * Given an instance index, return the coordinates
    */
   
    this.getInstancePosition = (position) => {
      const row = Math.floor(position / 2);
      const column = (position % 2) ? 1 : 0;

      // add ComputeNode label size
      const labelSpace = this.getComputeNodeLabelSize();

      // x = margin + (width * column) + ( maring * column)
      const x = serviceTopologyConfig.instance.margin + (serviceTopologyConfig.instance.width * column) + (serviceTopologyConfig.instance.margin * column);

      // y = label + margin + (height * row) + ( maring * row)
      const y = labelSpace + serviceTopologyConfig.instance.margin + (serviceTopologyConfig.instance.height * row) + (serviceTopologyConfig.instance.margin * row);
      return [x, y];
    };

    /**
    * Given an Compute Node index, return the coordinates
    */

    this.getComputeNodePosition = (nodes, position) => {
      const x = serviceTopologyConfig.computeNode.margin;

      let previousElEight = lodash.reduce(nodes.slice(0, position), (val, node) => {
        return val + this.getComputeNodeSize(node.instances)[1]
      }, 0);

      console.log('previousElEight ' + previousElEight);
      const y =
        serviceTopologyConfig.computeNode.margin
        + (serviceTopologyConfig.computeNode.margin * position)
        + previousElEight;


      return [x, y];
    };

  });
})();
