export type METHOD_DTYPE = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'OPTIONS' | 'CONNECT' | 'HEAD' | 'TRACE'

export interface Response_DTYPE<T = any> {
  data: T
  statusCode: number
  header?: Object
  errMsg?: string
  cookies?: Array<string>
}

export type CacheUnit_DTYPE = 'mm' | 'ss'

export interface Record_DTYPE { [key: string]: any }
export interface Header_DTYPE { [key: string]: string }
export type Data_DTYPE = Record_DTYPE

export interface Inject_DTYPE {
  /**
   * 去除token
   */
  _noToken?: boolean
  /**
   * 表单形式提交 FormData
   */
  _formData?: boolean
  /**
   * 头部内容
   */
  _header?: Header_DTYPE
  /**
   * 请求类型 'GET' | 'POST' | 'PUT' | 'DELETE' | 'OPTIONS' | 'CONNECT' | 'HEAD' | 'TRACE'
   */
  _method?: METHOD_DTYPE
  /**
   * 分页[page, size]
   */
  _page?: [number, number]
  /**
   * 分页字段设定['page', 'size']
   */
  _pageKey?: [string, string]
  /**
   * 缓存时间 秒单位
   */
  _cache?: number
  /**
   * 分钟单位mm 秒单位ss
   */
  _cacheUnit?: CacheUnit_DTYPE
  /**
   * 地址/page/:id
   */
  _id?: string
  /**
   * 地址/page/:id/:idnext
   */
  _idnext?: string
  /**
   * querystring参数
   */
  _param?: Data_DTYPE
  /**
   * 请求体参数
   */
  _body?: Data_DTYPE
  /**
   * 是否重复请求合并
   * 默认 true
   */
  _repeatMergeBool?: boolean
  /**
   * 请求重试错误次数
   * 默认 2
   */
  _retryCount?: number
  /**
   * 重试内时间定位 单位秒 在此时间内做错误重试请求
   * 默认 5
   */
  _retryInterval?: number
  /**
   * baseUrl 前缀域名
   */
  _baseURL?: string
  /**
   * 接口地址
   */
  _url?: string
  /**
   * 超时时间，单位毫秒
   * 默认 30s = 1000 * 30
   */
  _timeout?: number
  /**
   * 打印API接口地址是否MD5化
   */
  _printMD5?: boolean
  /**
   * 是否开启打印请求数据
   */
  _printConsole?: boolean
}

export interface RequestConfig_DTYPE {
  /**
   *  `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
   *  它可以通过设置一个 `baseURL` 便于为实例的方法传递相对 URL
   */
  baseURL: string
  /**
   * 资源url
   */
  url?: string
  /**
   * 默认为 GET
   * 可以是：OPTIONS，GET，HEAD，POST，PUT，DELETE，TRACE，CONNECT
   */
  method?: METHOD_DTYPE
  /**
   * 超时时间，单位毫秒
   * 默认 30s = 1000 * 30
   */
  timeout?: number
  /**
   * 设置请求的 header，header 中不能设置 Referer。
   * 平台差异说明：App、H5端会自动带上cookie，且H5端不可手动修改
   */
  header?: Header_DTYPE
  headers?: Header_DTYPE
  /**
   * querystring参数
   */
  param?: Data_DTYPE
  /**
   * 请求体参数
   */
  body?: Data_DTYPE
  /**
   * 自定义内容 格式函数
   */
  inject?: Inject_DTYPE
  /**
   * 缓存&SWR 是否开启
   * 默认 true
   */
  cacheBool?: boolean
  /**
   * 缓存&SWR 缓存时间 默认分单位 mm
   * 默认 -1
   */
  cacheTime?: number
  /**
   * 缓存&SWR 缓存单位 mm | ss
   * 默认 mm
   */
  cacheUnit?: CacheUnit_DTYPE
  /**
   * 是否重复请求合并
   * 默认 true
   */
  repeatMergeBool?: boolean
  /**
   * 是否请求错误后重试
   * 默认 true
   */
  retryBool?: boolean
  /**
   * 请求重试错误次数
   * 默认 2
   */
  retryCount?: number
  /**
   * 重试内时间定位 单位秒 在此时间内做错误重试请求
   * 默认 5
   */
  retryInterval?: number
  /**
   * 分页字段设置
   */
  pageKey?: [string, string]
  /**
   * 打印API接口地址是否MD5化
   */
  printMD5?: boolean
  /**
   * 是否开启打印请求数据
   */
  printConsole?: boolean
}

export type options_DTYPE = Omit<RequestConfig_DTYPE, 'url' | 'method' | 'param' | 'body' | 'inject'>
