import { $ajax } from "..";
type AjaxOpts = {
  /**
   * 接口请求url路径
   */
  url: string,

  /**
   * 接口调用方式
   * @default get
   */
  type?: 'get' | 'post' | 'put' | 'patch' | 'delete' | 'head',

  /**
   * 接口所需传参对象
   */
  data?: any,

  /**
   * 接口调用请求头(报文)
   */
  headers?: {[K: string]: string},

  /**
   * 接口数据返回类型
   * @default json
   */
  dataType?: 'json' | 'text' | 'blob',

  /**
   * 其它个性化配置
   */
  special?: object,

  /**
   * 接口调用之前触发
   */
  beforeSend?: Function,

  /**
   * 接口调用成功时触发
   */
  success?: Function,

  /**
   * 接口调用失败时触发
   */
  error?: Function,

  /**
   * 接口调用完成后触发
   */
  complete?: Function,

  /**
   * fetch其它剩余的配置项
   */
  option?: object,
}


declare function $ajax(options: AjaxOpts): Promise<any>;

/**
 * 接口GET调用方式
 * @param {string} url - 接口地址
 * @param {object} data - 接口参数
 * @param {function} success - 接口调用成功回调
 * @param {string} dataType - 响应数据类型
 */
declare function $get(url: string, data?: any, success?: (data, resModel) => void, dataType?: 'json' | 'text' | 'blob'): Promise<any>;

/**
 * 接口POST调用方式
 * @param {string} url - 接口地址
 * @param {object} data - 接口参数
 * @param {function} success - 接口调用成功回调
 * @param {string} dataType - 响应数据类型
 */
declare function $post(url: string, data?: any, success?: (data, resModel) => void, dataType?: 'json' | 'text' | 'blob'): Promise<any>;

/**
 * 接口PUT调用方式
 * @param {string} url - 接口地址
 * @param {object} data - 接口参数
 * @param {function} success - 接口调用成功回调
 * @param {string} dataType - 响应数据类型
 */
declare function $put(url: string, data?: any, success?: (data, resModel) => void, dataType?: 'json' | 'text' | 'blob'): Promise<any>;

/**
 * 接口PATCH调用方式
 * @param {string} url - 接口地址
 * @param {object} data - 接口参数
 * @param {function} success - 接口调用成功回调
 * @param {string} dataType - 响应数据类型
 */
declare function $patch(url: string, data?: any, success?: (data, resModel) => void, dataType?: 'json' | 'text' | 'blob'): Promise<any>;

/**
 * 接口DELETE调用方式
 * @param {string} url - 接口地址
 * @param {object} data - 接口参数
 * @param {function} success - 接口调用成功回调
 * @param {string} dataType - 响应数据类型
 */
declare function $delete(url: string, data?: any, success?: (data, resModel) => void, dataType?: 'json' | 'text' | 'blob'): Promise<any>;

/**
 * 接口HEAD调用方式
 * @param {string} url - 接口地址
 * @param {object} data - 接口参数
 * @param {function} success - 接口调用成功回调
 * @param {string} dataType - 响应数据类型
 */
declare function $head(url: string, data?: any, success?: (data, resModel) => void, dataType?: 'json' | 'text' | 'blob'): Promise<any>;

/**
 * 辅助方法
 */
declare namespace $ajax {

  /**
   * 接口返回的业务主体字段名称
   */
  var bodyField: string

  /**
   * 设置接口统一域名
   */
  var setBaseUrl: (ajaxBaseUrl: string, alone?: {test: string, host: string}[]) => void;

  /**
   * 获取接口统一域名
   */
  var getBaseUrl: () => string;

  /**
   * 接口请求之前公共拦截器
   */
   var injectBeforeSend: (callback: Function) => void;

  /**
 * 注入项目公用headers
 * @param {object} headers - 注入接口请求报文header
 */
  var injectHeaders: (headers: {[K: string]: string}) => void;

  /**
   * 取消项目公用headers
   */
  var uninjectHeaders: () => void;

  /**
 * 注入共性事务处理方法 偏业务类型
 * @param {function} callback - 回调事务处理
 * @param {function} [errorCallback] - 接口服务异常回调事务处理
 */
  var injectResponse: (callback: Function, errorCallback?: Function) => void;

  /**
   * 设置配置参数
   */
  var set: (key: string, value: any, value2?: any) => void;

  /**
   * 设置样式
   */
  var appendStyle: (colors: string) => void;

  /**
   * 提供内部某些常用的辅助方法
   */
  var querystring: (params: {[K: string]: any}) => string;
}

/**
 * 加载远程CSS,JS资源文件
 * @param {string | array} attachSrc - js或者css服务端或cdn远程地址
 * @param {function} [cb] - 加载成功之后回调
 * @param {boolean} [remove = true] - 是否移除
 */
declare function $getScript(attachSrc: string | Array<string>, cb?: Function, remove?: boolean): Promise<any>;

/**
 * jsonp实现方案
 * @param {string} url - 接口地址
 * @param {object} [params] - 接口参数
 * @param {string} [callbackName="callback"] - callback名称,一般情况下不需要特定,用默认值即可
 */
declare function $jsonp(url: string, params?: {[K: string]: any}, callbackName?: 'string'): Promise<any>;

/**
 * 提供一个简易版 ajax 方法，防止一些特殊情况需要
 * @param {object} options.url - 接口路径url
 * @param {object} options.type - 接口请求方式
 * @param {object} options.name - 字段名称
 * @param {object} options.data - 接口入参数据
 * @param {object} options.withCredentials - 是否带上cookie待授权字段
 * @param {object} options.headers - 请求头报文
 * @param {object} options.success - 接口请求成功
 * @param {object} options.error - 接口请求失败
 * @param {object} options.complete - 接口请求完成
 */
declare function Ajax(options: AjaxOpts & {name?: string, withCredentials?: boolean}): XMLHttpRequest;

declare namespace Ajax {
  var wrapper: (options: AjaxOpts) => Promise<any>;
}

export default $ajax;

export { $get }
export { $post }
export { $put }
export { $patch }
export { $delete }
export { $head }
export { Ajax }

export { $getScript }
export { $jsonp }
