
/*
 * 
 *   Copyright 2016 RIFT.IO Inc
 *
 *   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.
 *
 */
import React from 'react';
import ReactDOM from 'react-dom';
import d3 from 'd3';
import './metricBarGroup.scss';

class MetricBarGroup extends React.Component {
  constructor(props) {
    super(props);

  }
  componentWillMount() {
    const {...props} = this.props;
    this.margin = {top: 20, right: 50, bottom: 700, left: 100};
    this.width = 1220 - this.margin.left - this.margin.right;
    this.height = 1220 - this.margin.top - this.margin.bottom;
    // this.width = 800;
    // this.height = 600;
    this.x = d3.scale.ordinal()
      .rangeRoundBands([0, this.width], .1);

    this.y = d3.scale.linear()
      .range([this.height, 0]);

    this.xAxis = d3.svg.axis()
      .scale(this.x)
      .orient("bottom");

    this.yAxis = d3.svg.axis()
        .scale(this.y)
        .orient("left")
        .ticks(props.ticks.number, props.ticks.type);
  }
  componentDidMount() {
    let el = document.querySelector('#' + this.props.title + this.props.lp_id);
    this.svg = d3.select(el)
      .append('svg');
    let self = this;

    let totalWidth = this.width + this.margin.left + this.margin.right;
    let totalHeight = this.height + this.margin.top + this.margin.bottom;
    this.svg = this.svg
      .attr("viewBox", "-10 0 " + totalWidth + " " + totalHeight + "")
      .attr("preserveAspectRatio", "xMidYMid meet")
      .style("overflow","visible")
      .append("g")
      .attr("transform", "translate(" + this.margin.left + "," + this.margin.top + ")");

    this.svg.append("g")
        .attr("class", "y axis")
        .call(this.yAxis);
    this.svg.append("g")
        .attr("class", "x axis")
        .attr("transform", "translate(-1," + this.height + ")")
        .call(this.xAxis)
    this.drawBars(this.props);


  }
  componentWillReceiveProps(props) {
    this.drawBars(props);
  }
  drawBars = (props) => {
    let DATA = props.data.sort(function(a,b){
      return (a.id > b.id) ? -1 : 1;
    });
    this.x.domain(DATA.map(function(d, i) { return d.id }));
    let self = this;
    let barGroup = this.svg.selectAll(".barGroup").data(DATA, function(d, i) { return d.id});;
    let barGroupExit = barGroup.exit().remove();
    let barGroupEnter =  barGroup.enter().append('g')
      .attr('class', 'barGroup');
    barGroupEnter
      .append("rect")
      .attr("class", "bar")
      .attr("x", function(d) { return self.x(d.id); })
      .attr("width", self.x.rangeBand())
      .attr("y", function(d) { return self.y(d[props.valueName]); })
      .attr("height", function(d) {return self.height - self.y(d[props.valueName]); });
    barGroupEnter.append("g")
      .attr("transform", function(d){
        return "translate("+ (parseInt(self.x(d.id)) + (self.x.rangeBand() / 2) + 10) +"," + (parseInt(self.height) + 10) + ")"
       })
      .append('text')
      .classed('metriclabel', true)
      .style("text-anchor", "end")
      .attr('transform', 'rotate(-75)')
      .text(function(d) { return d.name;} )

    let barGroupUpdate = barGroup.transition();
    barGroupUpdate.select('rect')
      .attr("class", "bar")
      .attr("x", function(d) { return self.x(d.id) })
      .attr("width", self.x.rangeBand())
      .attr("y", function(d) { return self.y(d[props.valueName]); })
      .attr("height", function(d) {return self.height - self.y(d[props.valueName]); });
    barGroupUpdate
      .select('g')
      .attr("transform", function(d){
        return "translate("+ (parseInt(self.x(d.id)) + (self.x.rangeBand() / 2) + 10) +"," + (parseInt(self.height) + 10) + ")"
       })
      .select('text')
      .style("text-anchor", "end")
      .attr('transform', 'rotate(-75)')
      .text(function(d) { return d.name;} )
  }
  render() {
    let html = <div></div>;
    let self = this;
    return <div className="metricBarGroup"><h3>{this.props.title}</h3><div id={this.props.title + this.props.lp_id}></div></div>;
  }
}
MetricBarGroup.defaultProps = {
  ticks: {
    number: 2,
    type: '%'
  },
  valueName: 'utilization',
  title: '',
  data: []
}


export default MetricBarGroup;
