/**
 * @file defines echarts Heatmap Chart
 * @author Ovilia (me@zhangwenli.com)
 * Inspired by https://github.com/mourner/simpleheat
 *
 * @module
 *
 * @requires /src/chart/base.js
 * @requires /src/chart/layer/heatmap.js
 * @requires /src/config.js
 * @requires /src/util/ecData.js
 * @requires NPM:zrender/tool/util.js
 * @requires NPM:zrender/tool/color.js
 * @requires NPM:zrender/shape/Image.js
 */
module.exports = function (require) {
  var ChartBase = require('./base');

  var HeatmapLayer = require('../layer/heatmap');

  var ecConfig = require('../config');

  var ecData = require('../util/ecData');

  var zrUtil = require('zrender/tool/util');

  var zrColor = require('zrender/tool/color');

  var zrImage = require('zrender/shape/Image');

  ecConfig.heatmap = {
    zlevel: 0,
    z: 2,
    clickable: true
  };
  /**
   * Heatmap Chart
   *
   * @class
   * @extends ChartBase
   */

  function Heatmap(ecTheme, messageCenter, zr, option, myChart) {
    ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);
    this.refresh(option);
  }

  Heatmap.prototype = {
    type: ecConfig.CHART_TYPE_HEATMAP,

    /**
     * refreshes the chart
     * @param {Object} newOption - options to refresh the chart
     * @public
     */
    refresh: function (newOption) {
      this.clear();

      if (newOption) {
        this.option = newOption;
        this.series = newOption.series;
      }

      this._init();
    },

    /**
     * init heatmap
     * @private
     */
    _init: function () {
      var series = this.series;
      this.backupShapeList();
      var len = series.length;

      for (var i = 0; i < len; ++i) {
        if (series[i].type === ecConfig.CHART_TYPE_HEATMAP) {
          series[i] = this.reformOption(series[i]);
          var layer = new HeatmapLayer(series[i]);
          var canvas = layer.getCanvas(series[i].data, this.zr.getWidth(), this.zr.getHeight());
          var image = new zrImage({
            position: [0, 0],
            scale: [1, 1],
            hoverable: this.option.hoverable,
            style: {
              x: 0,
              y: 0,
              image: canvas,
              width: canvas.width,
              height: canvas.height
            }
          });
          this.shapeList.push(image); // this.zr.addShape(image);
        }
      }

      this.addShapeList();
    }
  };
  zrUtil.inherits(Heatmap, ChartBase);

  require('../chart').define('heatmap', Heatmap);

  return Heatmap;
}(require);