module.exports = function (require) {
  var Base = require('./Base');

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

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

  var zrArea = require('../tool/area');

  var SectorShape = require('../shape/Sector');

  function Spin(options) {
    Base.call(this, options);
  }

  util.inherits(Spin, Base);
  /**
   * 旋转
   * 
   * @param {Object} addShapeHandle
   * @param {Object} refreshHandle
   */

  Spin.prototype._start = function (addShapeHandle, refreshHandle) {
    var options = util.merge(this.options, {
      textStyle: {
        color: '#fff',
        textAlign: 'start'
      },
      backgroundColor: 'rgba(0, 0, 0, 0.8)'
    });
    var textShape = this.createTextShape(options.textStyle);
    var textGap = 10;
    var textWidth = zrArea.getTextWidth(textShape.highlightStyle.text, textShape.highlightStyle.textFont);
    var textHeight = zrArea.getTextHeight(textShape.highlightStyle.text, textShape.highlightStyle.textFont); // 特效默认配置

    var effectOption = util.merge(this.options.effect || {}, {
      r0: 9,
      r: 15,
      n: 18,
      color: '#fff',
      timeInterval: 100
    });
    var location = this.getLocation(this.options.textStyle, textWidth + textGap + effectOption.r * 2, Math.max(effectOption.r * 2, textHeight));
    effectOption.x = location.x + effectOption.r;
    effectOption.y = textShape.highlightStyle.y = location.y + location.height / 2;
    textShape.highlightStyle.x = effectOption.x + effectOption.r + textGap;
    var background = this.createBackgroundShape(options.backgroundColor);
    var n = effectOption.n;
    var x = effectOption.x;
    var y = effectOption.y;
    var r0 = effectOption.r0;
    var r = effectOption.r;
    var color = effectOption.color; // 初始化动画元素

    var shapeList = [];
    var preAngle = Math.round(180 / n);

    for (var i = 0; i < n; i++) {
      shapeList[i] = new SectorShape({
        highlightStyle: {
          x: x,
          y: y,
          r0: r0,
          r: r,
          startAngle: preAngle * i * 2,
          endAngle: preAngle * i * 2 + preAngle,
          color: zrColor.alpha(color, (i + 1) / n),
          brushType: 'fill'
        }
      });
    }

    var pos = [0, x, y];
    return setInterval(function () {
      addShapeHandle(background);
      pos[0] -= 0.3;

      for (var i = 0; i < n; i++) {
        shapeList[i].rotation = pos;
        addShapeHandle(shapeList[i]);
      }

      addShapeHandle(textShape);
      refreshHandle();
    }, effectOption.timeInterval);
  };

  return Spin;
}(require);