import { anyFunction, LooseObject, GraphDataNode, GraphDataLink, GraphData, injectValue, plugin } from './common';
import GraphOptions from './options';
import Main from './main';
import Event from './event';
import Events from './events'; // 需要和Event区分一下
import * as Forces from './forces';

import PluginSystem from './plugin-system';
import Render from './render';
import Simulation from './simulation';
import Util from './util';
import EventBus, { on, emit } from './event-bus';

// 插件
import bezierCurveController from './plugins/bezier-curve-controller';
import colorPalette from './plugins/color-palette';
import colorType from './plugins/color-type';
import highlight from './plugins/highlight';
import layoutForce from './plugins/layout-force';
import layoutLayer from './plugins/layout-layer';
import layoutRing from './plugins/layout-ring';
import occlusionDetection from './plugins/occlusion-detection';
import rectSelection from './plugins/rect-selection';
import selector from './plugins/selector';
import toolHelper from './plugins/tool-helper';
import dynamicLoadData from './plugins/dynamic-load-data';
import LockNode from './plugins/lock-node';

declare class ForceGraphVis {
  [key: string]: any;
  static version?: number; // 版本号
  constructor(options: GraphOptions); //构造函数

  setOptions: Main.setOptions;
  initGraph: Main.initGraph;
  render: Main.render;
  start: Main.start;
  reset: Main.reset;
  resize: Main.resize;
  destroy: Main.destroy;

  // 事件
  event: EventBus;
  eventEmitter: EventBus;
  eventBus: EventBus;
  bus: EventBus;
  $bus: EventBus;
  on: on;
  emit: emit;

  // 实例属性
  data: GraphData; // 数据
  domWrap: HTMLDivElement; // 外部dom容器
  dom: HTMLDivElement; // 内部自己创建的dom容器
  width: number; // dom的宽度
  height: number; // dom的高度
  isStop: boolean; // 是否停止
  isDestroy: boolean; // 是否销毁
  isDrag: boolean; // 是否在拖拽
  isTicking: boolean; // 是否在力学模拟tick

  // highlightNodes: GraphDataNode[]; // 高亮节点
  // highlightLinks: GraphDataLink[]; // 高亮边
  plugins: LooseObject;

  // 插件
  injectProperty: PluginSystem.injectProperty;
  injectFunction: PluginSystem.injectFunction;
  injectObject: PluginSystem.injectObject;
  inject: PluginSystem.inject;
  injectHooks: PluginSystem.injectHooks;
  use: PluginSystem.use;
  getPluginOptions: PluginSystem.getPluginOptions;

  // 事件
  compatMouseEvent: Event.compatMouseEvent;
  compatClickEvent: Event.compatClickEvent;
  addZoomEvent: Event.addZoomEvent;
  zoom: Event.zoom;
  zoomTo: Event.zoomTo;
  zoomIn: Event.zoomIn;
  zoomOut: Event.zoomOut;
  transformTo: Event.transformTo;
  translateTo: Event.translateTo;
  dragstarted: Event.dragstarted;
  dragged: Event.dragged;
  dragended: Event.dragended;
  addNodeEvent: Event.addNodeEvent;
  addLinkEvent: Event.addLinkEvent;
  dragstartedCanvas: Event.dragstartedCanvas;
  draggedCanvas: Event.draggedCanvas;
  dragendedCanvas: Event.dragendedCanvas;
  addNodeEventCanvas: Event.addNodeEventCanvas;

  // 渲染svg
  arrowDefs: Render.arrowDefs;
  createDefs: Render.createDefs;
  createLinks: Render.createLinks;
  createNodes: Render.createNodes;
  createSvg: Render.createSvg;
  drawLink: Render.drawLink;
  drawNode: Render.drawNode;
  // 渲染svg
  createCanvas: Render.createCanvas;
  refresh: Render.refresh;

  // 模拟器
  tickNum: Simulation.tickNum; // tick次数
  tickTimeStart: Simulation.tickTimeStart; // tick开始时间
  simulation: Simulation.simulation; // 模拟器对象
  initSimulation: Simulation.initSimulation;
  startSimulation: Simulation.startSimulation;
  stopSimulation: Simulation.stopSimulation;
  ticked: Simulation.ticked;

  // 工具
  util: {
    arcPath: Util.arcPath;
    bezierCurveCoord: Util.bezierCurveCoord;
    getProportion: Util.getProportion;
    bezierPath: Util.bezierPath;
    couldBeClass: Util.couldBeClass;
    GraphCreator: Util.GraphCreator;
    layoutLayerData: Util.layoutLayerData;
    layoutLayerCoord: Util.layoutLayerCoord;
    layoutRingCoord: Util.layoutRingCoord;
    linkCoord: Util.linkCoord;
    OcclusionDetection: Util.OcclusionDetection;
    straightPath: Util.straightPath;
  };

  // 插件
  polylinesGroup: bezierCurveController.polylinesGroup;
  circle2sGroup: bezierCurveController.circle2sGroup;
  circle3sGroup: bezierCurveController.circle3sGroup;
  createBezierCurve: bezierCurveController.createBezierCurve;
  dragBezierControlPoints: bezierCurveController.dragBezierControlPoints;
  hiddenControlPoints: bezierCurveController.hiddenControlPoints;
  onClickBezierControl: bezierCurveController.onClickBezierControl;
  tickedBezierControl: bezierCurveController.tickedBezierControl;
  updateBezierPath: bezierCurveController.updateBezierPath;

  color: colorPalette.color;
  nodeColor: colorPalette.nodeColor;
  linkColor: colorPalette.linkColor;
  colorType: colorType;

  setHighlightStep: highlight.setHighlightStep;
  setHighlight: highlight.setHighlight;
  resetHighlight: highlight.resetHighlight;
  pureHighlight: highlight.pureHighlight;
  isConnected: highlight.isConnected;
  light: highlight.light;
  dark: highlight.dark;
  flyLine: highlight.flyLine;

  layoutForce: layoutForce.layoutForce;
  layoutLayer: layoutLayer.layoutLayer;
  layoutRing: layoutRing.layoutRing;

  startOD: occlusionDetection.startOD;
  stopOD: occlusionDetection.stopOD;

  updateData: dynamicLoadData.updateData;
  clear: dynamicLoadData.clear;
  getNodeById: dynamicLoadData.getNodeById;
  getLinkById: dynamicLoadData.getLinkById;
  deleteNodeById: dynamicLoadData.deleteNodeById;
  deleteLinkById: dynamicLoadData.deleteLinkById;

  brush: rectSelection.brush;
  brushArea: rectSelection.brushArea;
  activeRectSelection: rectSelection.activeRectSelection;
  deactivatedRectSelection: rectSelection.deactivatedRectSelection;
  brushstarted: rectSelection.brushstarted;
  brushing: rectSelection.brushing;
  brushended: rectSelection.brushended;
  handleBrush: rectSelection.handleBrush;

  lockNode: LockNode.lockNode; // 锁定节点
  drawLock: LockNode.drawLock;
  setLock: LockNode.setLock;
  removeLock: LockNode.removeLock;

  graphSelector: selector.graphSelector;
  findLinkedRoute: selector.findLinkedRoute;

  random: toolHelper.random;
  $sleep: toolHelper.$sleep;
}
export default ForceGraphVis;

declare let util: any;
declare let plugin: any;
declare let Constants: any;

export { util, plugin, Events, Constants, Forces };
