/**
 * zrender
 *
 * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
 *
 * shape类：时间轴线
 */
module.exports = function (require) {
  var Base = require('zrender/shape/Base');

  var IconShape = require('./Icon');

  var dashedLineTo = require('zrender/shape/util/dashedLineTo');

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

  var matrix = require('zrender/tool/matrix');

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

  Chain.prototype = {
    type: 'chain',

    /**
     * 画刷
     * @param ctx       画布句柄
     * @param e         形状实体
     * @param isHighlight   是否为高亮状态
     * @param updateCallback 需要异步加载资源的shape可以通过这个callback(e)
     *                       让painter更新视图，base.brush没用，需要的话重载brush
     */
    brush: function (ctx, isHighlight) {
      var style = this.style;

      if (isHighlight) {
        // 根据style扩展默认高亮样式
        style = this.getHighlightStyle(style, this.highlightStyle || {});
      }

      ctx.save();
      this.setContext(ctx, style); // 设置transform

      this.setTransform(ctx);
      ctx.save();
      ctx.beginPath();
      this.buildLinePath(ctx, style);
      ctx.stroke();
      ctx.restore();
      this.brushSymbol(ctx, style);
      ctx.restore();
      return;
    },

    /**
     * 创建线条路径
     * @param {Context2D} ctx Canvas 2D上下文
     * @param {Object} style 样式
     */
    buildLinePath: function (ctx, style) {
      var x = style.x;
      var y = style.y + 5;
      var width = style.width;
      var height = style.height / 2 - 10;
      ctx.moveTo(x, y);
      ctx.lineTo(x, y + height);
      ctx.moveTo(x + width, y);
      ctx.lineTo(x + width, y + height);
      ctx.moveTo(x, y + height / 2);

      if (!style.lineType || style.lineType == 'solid') {
        ctx.lineTo(x + width, y + height / 2);
      } else if (style.lineType == 'dashed' || style.lineType == 'dotted') {
        var dashLength = (style.lineWidth || 1) * (style.lineType == 'dashed' ? 5 : 1);
        dashedLineTo(ctx, x, y + height / 2, x + width, y + height / 2, dashLength);
      }
    },

    /**
     * 标线始末标注
     */
    brushSymbol: function (ctx, style) {
      var y = style.y + style.height / 4;
      ctx.save();
      var chainPoint = style.chainPoint;
      var curPoint;

      for (var idx = 0, l = chainPoint.length; idx < l; idx++) {
        curPoint = chainPoint[idx];

        if (curPoint.symbol != 'none') {
          ctx.beginPath();
          var symbolSize = curPoint.symbolSize;
          IconShape.prototype.buildPath(ctx, {
            iconType: curPoint.symbol,
            x: curPoint.x - symbolSize,
            y: y - symbolSize,
            width: symbolSize * 2,
            height: symbolSize * 2,
            n: curPoint.n
          });
          ctx.fillStyle = curPoint.isEmpty ? '#fff' : style.strokeColor;
          ctx.closePath();
          ctx.fill();
          ctx.stroke();
        }

        if (curPoint.showLabel) {
          ctx.font = curPoint.textFont;
          ctx.fillStyle = curPoint.textColor;
          ctx.textAlign = curPoint.textAlign;
          ctx.textBaseline = curPoint.textBaseline;

          if (curPoint.rotation) {
            ctx.save();

            this._updateTextTransform(ctx, curPoint.rotation);

            ctx.fillText(curPoint.name, curPoint.textX, curPoint.textY);
            ctx.restore();
          } else {
            ctx.fillText(curPoint.name, curPoint.textX, curPoint.textY);
          }
        }
      }

      ctx.restore();
    },
    _updateTextTransform: function (ctx, rotation) {
      var _transform = matrix.create();

      matrix.identity(_transform);

      if (rotation[0] !== 0) {
        var originX = rotation[1] || 0;
        var originY = rotation[2] || 0;

        if (originX || originY) {
          matrix.translate(_transform, _transform, [-originX, -originY]);
        }

        matrix.rotate(_transform, _transform, rotation[0]);

        if (originX || originY) {
          matrix.translate(_transform, _transform, [originX, originY]);
        }
      } // 保存这个变换矩阵


      ctx.transform.apply(ctx, _transform);
    },
    isCover: function (x, y) {
      var rect = this.style;

      if (x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height) {
        // 矩形内
        return true;
      } else {
        return false;
      }
    }
  };
  zrUtil.inherits(Chain, Base);
  return Chain;
}(require);