    import { getGUID } from '../../util'

    class UndoRedoManager {
      constructor() {
        this._id = getGUID()
        this._init()
      }

      /**
       * 初始化管理工具
       * @private
       */
      _init() {
        this.processCollection = []
        this.currentStateIndex = -1
      }

      /**
       * 撤销当前编辑操作<a id='undo'></a>
       * @returns {SketchStage}
       */
      undo() {
        if (this.canUndo()) {
          this.currentStateIndex--
          const preProcess = this.processCollection[this.currentStateIndex]
          return preProcess.sketchStage.clone()
        } else {
          return null
        }
      }

      /**
       * 恢复被撤销的草图<a id='redo'></a>
       * @returns {SketchStage}
       */
      redo() {
        if (this.canRedo()) {
          this.currentStateIndex++
          const nextProcess = this.processCollection[this.currentStateIndex]
          return nextProcess.sketchStage.clone()
        } else {
          return null
        }
      }

      /**
       * 草图是否可执行撤销操作<a id='canUndo'></a>
       * @returns {Boolean}
       */
      canUndo() {
        let canDo = false
        if (this.processCollection.length > 1 && this.currentStateIndex > 0) {
          canDo = true
        }
        return canDo
      }

      /**
       * 草图是否可执行恢复操作<a id='canRedo'></a>
       * @returns {Boolean}
       */
      canRedo() {
        let canDo = false
        if (
          this.processCollection.length > 1 &&
          this.currentStateIndex < this.processCollection.length - 1
        ) {
          canDo = true
        }
        return canDo
      }

      /**
       * 添加草图状态<a id='addProcess'></a>
       * @param {String} type  操作类型 type值为 "add"或"update"
       * @param {SketchStage} sketchStage 草图图形集合
       */
      addProcess(type, sketchStage) {
        sketchStage = sketchStage.clone()
        const id = getGUID()
        const process = {
          id,
          type,
          sketchStage,
          index: this.processCollection.length
        }
        if (this.currentStateIndex === this.processCollection.length - 1) {
          this.processCollection.push(process)
        } else {
          this.processCollection.splice(
            this.currentStateIndex + 1,
            this.processCollection.length - (this.currentStateIndex + 1),
            process
          )
        }
        this.currentStateIndex = this.processCollection.length - 1
      }

      /** 重置初始化管理工具
       */
      reset() {
        this._init()
      }

      removeProcessById(id) {
        const process = this.getProcessById(id)
        if (process) {
          this.processCollection.splice(process.index, 1)
        }
      }

      getProcessById(id) {
        const process = this.processCollection.filter((item) => item.id === id)
        if (process.length > 0) {
          return process[0]
        } else {
          return null
        }
      }

      _getNextProcess() {}
    }
    export default UndoRedoManager