/* eslint-disable  no-use-before-define */
import d3 from 'd3';
import cloudLayout from 'd3-cloud';
import { category21 } from '../javascripts/modules/colors';

function wordCloudChart(slice, payload) {
  const chart = d3.select(slice.selector);
  const data = payload.data;
  const fd = slice.formData;
  const range = [
    fd.size_from,
    fd.size_to,
  ];
  const rotation = fd.rotation;
  let fRotation;
  if (rotation === 'square') {
    fRotation = () => Math.floor((Math.random() * 2) * 90);
  } else if (rotation === 'flat') {
    fRotation = () => 0;
  } else {
    fRotation = () => Math.floor(((Math.random() * 6) - 3) * 30);
  }
  const size = [slice.width(), slice.height()];

  const scale = d3.scale.linear()
  .range(range)
  .domain(d3.extent(data, function (d) {
    return d.size;
  }));

  function draw(words) {
    chart.selectAll('*').remove();

    chart.append('svg')
    .attr('width', layout.size()[0])
    .attr('height', layout.size()[1])
    .append('g')
    .attr('transform', `translate(${layout.size()[0] / 2},${layout.size()[1] / 2})`)
    .selectAll('text')
    .data(words)
    .enter()
    .append('text')
    .style('font-size', d => d.size + 'px')
    .style('font-family', 'Impact')
    .style('fill', d => category21(d.text))
    .attr('text-anchor', 'middle')
    .attr('transform', d => `translate(${d.x}, ${d.y}) rotate(${d.rotate})`)
    .text(d => d.text);
  }

  const layout = cloudLayout()
  .size(size)
  .words(data)
  .padding(5)
  .rotate(fRotation)
  .font('serif')
  .fontSize(d => scale(d.size))
  .on('end', draw);

  layout.start();
}

module.exports = wordCloudChart;
