import { anyFunction, LooseObject, GraphDataNode, GraphDataLink, GraphData, injectValue, plugin } from './common';

// 事件
declare namespace PluginSystem {
  /**
   * @function injectProperty
   * @function injectFunction
   * @description 绑定属性/方法到实例中
   * @param {string} key 绑定的key名
   * @param {any} value 绑定的value值
   * @param {boolean} [forceInject]
   */
  interface injectProperty {
    (key: string, value: injectValue, forceInject: boolean): any;
  }
  interface injectFunction {
    (key: string, value: injectValue, forceInject: boolean): any;
  }

  /**
   * @function injectObject
   * @function inject
   * @description 绑定对象的属性/方法到实例上
   * @param object 需要被绑定的对象
   */
  interface injectObject {
    (object: LooseObject): any;
  }
  interface inject {
    (object: LooseObject): any;
  }

  /**
   * @function injectHooks
   * @description 绑定事件钩子
   * @param hooksObject
   */
  interface injectHooks {
    (hooksObject: LooseObject): any;
  }

  /**
   * @function use
   * @description 将对象里的属性/方法绑定到实例，将逐渐替换掉inject方法
   * @param {object} plugin 需要被注入的对象
   * @param {function} [plugin.install] 如有install方法则运行，让插件自定义注入
   * @param {Class|function} plugin 如果是一个类，install方法为必选，会自动调用
   * @param {string} [compactFuncName] 兼容第二个参数是函数名的情况
   * @return this
   */
  interface use {
    (plugin: plugin, compactFuncName?: any): any;
  }

  /**
   * @function getPluginOptions
   * @description 获取插件的配置
   * @param {string} plugin 插件名字
   * @param {object} plugin 插件实例
   * @param {string} plugin.name 插件实例
   * @return {any} 插件配置
   */
  interface getPluginOptions {
    (plugin: plugin | string): LooseObject;
  }
}
export default PluginSystem;
