// 事件
declare namespace Event {
  /**
   * @function compatMouseEvent
   * @description 兼容鼠标事件
   * @param {Object} event 事件对象
   * @param {Object} d 数据对象
   * @return {Object} event 事件对象
   * @return {Object} d 数据对象
   */
  interface compatMouseEvent {
    (event: any, d: any): { d: any; event: any };
  }

  /**
   * @function compatMouseEvent
   * @description 兼容鼠标事件
   * @param {Object} datum 数据对象
   * @param {number} index 下标
   * @param {Object} elements 元素数组
   * @param {Object} selection 全集
   * @param {Object} ctx 上下文
   * @return {Object} item 数据对象
   * @return {Object} index 下标
   * @return {Object} array 元素数组
   * @return {Object} event 事件对象
   */
  interface compatClickEvent {
    (datum: any, index: any, elements: any, selection: any, ctx: any): {
      item: any;
      index: any;
      array: any;
      event: any;
    };
  }

  /**
   * @function mouseEventJudge
   * @description 是否可以触发事件
   * @param {string} eventType 事件类型
   * @return {Object} data 事件对象
   * @return {boolean} 是否可以值
   */
  interface mouseEventJudge {
    (eventType: string, data: any): boolean;
  }

  /**
   * @function addZoomEvent
   * @description 添加各种zoom功能
   */
  interface addZoomEvent {
    (): void;
  }

  /**
   * @function zoom
   * @description 添加画布的zoom事件
   */
  interface zoom {
    (): void;
  }

  /**
   * @function zoomTo
   * @description 缩放到指定k值
   * @param {number} k 缩放比例 默认值1
   * @param {number} duration 动画时间 默认值700
   */
  interface zoomTo {
    (k?: number, duration?: number): void;
  }

  /**
   * @function zoomIn
   * @description 当前缩放k值 * scaleRatio
   * @param {number} scaleRatio 缩放比例 默认值1.2
   * @param {number} duration 动画时间 默认值700
   */
  interface zoomIn {
    (scaleRatio?: number, duration?: number): void;
  }

  /**
   * @function zoomOut
   * @description 当前缩放k值 * scaleRatio
   * @param {number} scaleRatio 缩放比例 默认值0.8
   * @param {number} duration 动画时间 默认值700
   */
  interface zoomOut {
    (scaleRatio?: number, duration?: number): void;
  }

  /**
   * @function transformTo
   * @description 移动缩放到某个位置
   * @param {object} transform d3.transform对象 {x:number; y:number; k:number}
   * @param {number} duration 持续时间
   */
  interface transformTo {
    (transform?: any, duration?: number): void;
  }

  /**
   * @function translateTo
   * @description 移动缩放到某个位置(基于当前尺寸)
   * @param {number} width 位置的x
   * @param {number} height 位置的y
   * @param {number} duration 持续时间
   */
  interface translateTo {
    (width?: number, height?: number, duration?: number): void;
  }

  /**
   * @function dragstarted
   * @description 节点拖拽开始
   * @param {Object} event 事件对象
   * @param {Object} d 数据对象
   */
  interface dragstarted {
    (event: any, d: any): void;
  }

  /**
   * @function dragged
   * @description 节点拖拽中
   * @param {Object} event 事件对象
   * @param {Object} d 数据对象
   */
  interface dragged {
    (event: any, d: any): void;
  }

  /**
   * @function dragended
   * @description 节点拖拽结束
   * @param {Object} event 事件对象
   * @param {Object} d 数据对象
   */
  interface dragended {
    (event: any, d: any): void;
  }

  /**
   * @function addNodeEvent
   * @description 添加节点事件
   * @param {Object[]} nodesGroup 节点集合
   */
  interface addNodeEvent {
    (nodesGroup: any[]): void;
  }

  /**
   * @function addLinkEvent
   * @description 添加边事件
   * @param {Object[]} linksGroup 节点集合
   */
  interface addLinkEvent {
    (linksGroup: any[]): void;
  }

  /**
   * @function dragstartedCanvas
   * @description 节点拖拽开始 Canvas
   * @param {Object} event 事件对象
   * @param {Object} d 数据对象
   */
  interface dragstartedCanvas {
    (event: any, d: any): void;
  }

  /**
   * @function draggedCanvas
   * @description 节点拖拽中 Canvas
   * @param {Object} event 事件对象
   * @param {Object} d 数据对象
   */
  interface draggedCanvas {
    (event: any, d: any): void;
  }

  /**
   * @function dragendedCanvas
   * @description 节点拖拽结束 Canvas
   * @param {Object} event 事件对象
   * @param {Object} d 数据对象
   */
  interface dragendedCanvas {
    (event: any, d: any): void;
  }

  /**
   * @function addNodeEventCanvas
   * @description 添加节点事件 Canvas
   * @param {Object[]} nodesGroup 节点集合
   */
  interface addNodeEventCanvas {
    (nodesGroup: any[]): void;
  }
}

export default Event;
