/* eslint-disable @typescript-eslint/class-name-casing */
/* eslint-disable @typescript-eslint/no-namespace */
declare namespace WechatJSSDK {
  type JSApiList = 'updateAppMessageShareData'
  | 'updateTimelineShareData'
  | 'onMenuShareTimeline'
  | 'onMenuShareAppMessage'
  | 'onMenuShareQQ'
  | 'onMenuShareWeibo'
  | 'onMenuShareQZone'
  | 'startRecord'
  | 'stopRecord'
  | 'onVoiceRecordEnd'
  | 'playVoice'
  | 'pauseVoice'
  | 'stopVoice'
  | 'onVoicePlayEnd'
  | 'uploadVoice'
  | 'downloadVoice'
  | 'chooseImage'
  | 'previewImage'
  | 'uploadImage'
  | 'downloadImage'
  | 'translateVoice'
  | 'getNetworkType'
  | 'openLocation'
  | 'getLocation'
  | 'hideOptionMenu'
  | 'showOptionMenu'
  | 'hideMenuItems'
  | 'showMenuItems'
  | 'hideAllNonBaseMenuItem'
  | 'showAllNonBaseMenuItem'
  | 'closeWindow'
  | 'scanQRCode'
  | 'chooseWXPay'
  | 'openProductSpecificView'
  | 'addCard'
  | 'chooseCard'
  | 'openCard';

  type MenuList = 'menuItem:exposeArticle'
  | 'menuItem:setFont'
  | 'menuItem:dayMode'
  | 'menuItem:nightMode'
  | 'menuItem:refresh'
  | 'menuItem:profile'
  | 'menuItem:addContact'
  | 'menuItem:share:appMessage'
  | 'menuItem:share:timeline'
  | 'menuItem:share:qq'
  | 'menuItem:share:weiboApp'
  | 'menuItem:favorite'
  | 'menuItem:share:facebook'
  | 'menuItem:share:QZone'
  | 'menuItem:editTag'
  | 'menuItem:delete'
  | 'menuItem:copyUrl'
  | 'menuItem:originPage'
  | 'menuItem:readMode'
  | 'menuItem:openWithQQBrowser'
  | 'menuItem:openWithSafari'
  | 'menuItem:share:email'
  | 'menuItem:share:brand';

  /**
   * config接口注入的配置信息
   */
  interface ConfigOptions {
    // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
    debug?: boolean;
    // 公众号AppID
    appId: string;
    // 生成签名时间戳
    timestamp: string;
    // 生成签名随即传
    nonceStr: string;
    // 签名
    signature: string;
    // 需要使用的JS接口列表
    jsApiList: JSApiList[];
  }

  /**
   *
   */
  interface callback {
    success?: (res: object) => void;
    fail?: (res: object) => void;
    complete?: (res: object) => void;
    cancel?: (res: object) => void;
    trigger?: (res: object) => void;
  }

  /**
   * 判断当前客户端是否允许JS接口配置
   */
  interface checkJsAPIOptions extends callback {
    // 需要检测的JS接口列表，所有JS接口列表见文档,
    jsApiList: JSApiList[];
  }

  // 分享内容
  interface shareDataOptions extends callback {
    // 分享标题
    title: string;
    // 分享描述
    desc?: string;
    // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
    link: string;
    // 分享图标
    imgUrl: string;
  }

  // 旧版分享给朋友自定义内容
  interface shareAppDataOptions extends shareDataOptions {
    // 分享类型,music、video或link，不填默认为link
    type?: 'music' | 'video' | 'link';
    // 如果type是music或video，则要提供数据链接，默认为空
    data?: string;
  }

  // 尺寸类型
  type sizeType = 'original' | 'compressed';
  // 图片来源
  type sourceType = 'album' | 'camera';

  // 选择图片
  interface chooseImageOptions extends callback {
    // 允许最多多少张
    count: number;
    // 尺寸类型 原图/压缩图 默认都有
    sizeType: sizeType[];
    // 指定来源 相册/相机 默认都要
    sourceType: sourceType[];
  }

  // 图片预览
  interface previewImageOptions extends callback {
    // 当前显示图片的地址
    current: string;
    // 需要预览图片的HTTP列表
    urls: string[];
  }

  // 上传图片
  interface uploadImageOptions extends callback {
    // 本地图片ID，通过chooseImage接口获得
    localId: string;
    // 是否显示进度条 默认1
    isShowProgressTips: 0 | 1;
  }

  // 下载图片
  interface downloadImageOptions extends callback {
    // 需要下载图片的服务端ID
    serverId: string;
    //是否显示进度条 默认1
    isShowProgressTips: 0 | 1;
  }

  // 获得本地图片
  interface getLocalImgDataOptions extends callback {
    // 本地图片ID
    localId: string;
  }

  // 播放音频接口
  interface playVoiceOptions extends callback {
    // 本地音频ID
    localId: string;
  }

  // 暂停播放音频
  interface pauseVoiceOptions extends callback {
    // 本地音频ID
    localId: string;
  }

  // 暂停播放音频
  interface stopVoiceOptions extends callback {
    // 本地音频ID
    localId: string;
  }

  // 上传音频
  interface uploadVoiceOptions extends callback {
    // 本地音频ID，通过stopRecord接口获得
    localId: string;
    // 是否显示进度条 默认1
    isShowProgressTips: 0 | 1;
  }

  // 下载音频
  interface downloadVoiceOptions extends callback {
    // 需要下载音频的服务端ID
    serverId: string;
    //是否显示进度条 默认1
    isShowProgressTips: 0 | 1;
  }

  // 识别音频
  interface translateVoiceOptions extends callback {
    // 本地音频ID，通过stopRecord接口获得
    localId: string;
    // 是否显示进度条 默认1
    isShowProgressTips: 0 | 1;
  }

  // 使用微信内置地图查看位置
  interface openLocationOptions extends callback {
    // 纬度，浮点数，范围为90 ~ -90
    latitude: number;
    // 经度，浮点数，范围为180 ~ -180。
    longitude: number;
    // 位置名
    name: string;
    // 地址详情说明
    address: string;
    // 地图缩放级别,整形值,范围从1~28。默认为最大
    scale: number;
    // 在查看位置界面底部显示的超链接,可点击跳转
    infoUrl: string;
  }

  // 获取地理位置
  interface getLocationOptions extends callback {
    // 默认为wgs84的gps坐标，如果要返回直接给openLocation用的火星坐标，可传入'gcj02'
    type: 'wgs84' | 'gcj02';
  }

  // 开启查找周边ibeacon设备
  interface startSearchBeaconsOptions extends callback {
    // 摇周边的业务ticket, 系统自动添加在摇出来的页面链接后面
    ticket: string;
  }

  // 批量隐藏功能按钮
  interface hideMenuItemsOptions extends callback {
    // 要隐藏的菜单项
    menuList: MenuList[];
  }

  // 批量显示功能按钮
  interface showMenuItemsOptions extends callback {
    // 要显示的菜单项
    menuList: MenuList[];
  }

  // 可以指定扫二维码还是一维码，默认二者都有
  type ScanType = 'qrCode' | 'barCode';

  // 调起微信扫一扫
  interface scanQRCodeOptions extends callback {
    // 默认为0，扫描结果由微信处理，1则直接返回扫描结果，
    needResult: 0 | 1;
    // 可以指定扫二维码还是一维码，默认二者都有
    scanType: ScanType[];
  }

  // 跳转微信商品页
  interface openProductSpecificViewOptions extends callback {
    // 商品id
    productId: string;
    // 0.默认值，普通商品详情页1.扫一扫商品详情页2.小店商品详情页
    viewType: 0 | 1 | 2;
  }

  // 拉取适用卡券列表并获取用户选择
  interface chooseCardOptions extends callback {
    // 门店id
    shopId: string;
    // 卡券类型
    cardType: string;
    // 卡券ID
    cardId: string;
    // 时间戳
    timestamp: number;
    // 签名随机串
    nonceStr: string;
    // 签名方式 默认SHA1
    signType?: string;
    // 卡券签名
    cardSign: string;
  }

  // 卡券信息
  type AddCardList = {
    // 卡券ID
    cardId: string;
    // 卡券附属信息
    cardExt: string;
  }

  // 批量添加卡券
  interface addCardOptions extends callback {
    // 卡券列表
    cardList: AddCardList[];
  }

  // 打开卡券List
  type OpenCardList = {
    // 卡券ID
    cardId: string;
    // 卡券Code
    code: string;
  }

  // 查看微信卡包中的卡券
  interface openCardOptions extends callback {
    cardList: openCardOptions[];
  }

  // 微信支付
  interface chooseWxPayOptions extends callback {
    // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    timestamp: number;
    // 支付签名随机串，不长于 32 位
    nonceStr: string;
    // 统一支付接口返回的prepay_id参数值 提交格式如：prepay_id=\*\*\*）
    package: string;
    // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
    signType: 'SHA1' | 'MD5';
    // 支付签名
    paySign: string;
  }

  /**
   * 注入权限验证配置
   * 如果要使用js-sdk必须调用该接口注入配置信息，否则无法使用
   * 当您的应用是SPA模式时，建议您在改变URL的时候调用
   * @param config
   */
  function config(config: ConfigOptions): void;

  /**
   * 当config通过之后，会调用该方法
   * @param success
   */
  function ready(success: () => void): void;

  /**
   * 当config鉴权失败，会调用该方法
   * @param error
   */
  function error(error: (res: object) => void): void;

  /**
   * 自定义“分享给朋友”及“分享到QQ”按钮的分享内容
   * 客户端6.7.2+ && JSSDK 1.4.0+ 可用
   * @param options
   */
  function updateAppMessageShareData(options: shareDataOptions): void;

  /**
   * 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容
   * 客户端6.7.2+ && JSSDK 1.4.0+ 可用
   * @param options
   */
  function updateTimelineShareData(options: shareDataOptions): void;

  /**
   * 获取“分享到朋友圈”按钮点击状态及自定义分享内容
   * 即将废弃，建议使用updateTimelineShareData
   * @param options
   */
  function onMenuShareTimeline(options: shareDataOptions): void;

  /**
   * 获取“分享给朋友”按钮点击状态及自定义分享内容
   * 即将废弃，建议使用updateAppMessageShareData
   * @param options
   */
  function onMenuShareAppMessage(options: shareAppDataOptions): void;


  /**
   * 获取“分享到QQ”按钮点击状态及自定义分享内容接口
   * 即将废弃，建议使用updateAppMessageShareData
   * @param options
   */
  function onMenuShareQQ(options: shareDataOptions): void;

  /**
   * 获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
   * @param options
   */
  function onMenuShareWeibo(options: shareDataOptions): void;

  /**
   * 获取“分享到QQ空间”按钮点击状态及自定义分享内容
   * 即将废弃，建议使用updateTimelineShareData
   * @param options
   */
  function onMenuShareQZone(options: shareDataOptions): void;


  /**
   * 判断当前客户端版本是否支持指定JS接口
   * 客户端6.0.2新引入的一个预留接口，第一期开放的接口均可不使用checkJsApi来检测。
   * @param options
   */
  function checkJsApi(options: checkJsAPIOptions): void;

  /**
   * 拍照/相册中选择图片
   * @param options
   */
  function chooseImage(options: chooseImageOptions): void;

  /**
   * 图片预览
   * @param options
   */
  function previewImage(options: previewImageOptions): void;

  /**
   * 图片上传
   * @param options
   */
  function uploadImage(options: uploadImageOptions): void;

  /**
   * 图片下载
   * @param options
   */
  function downloadImage(options: downloadImageOptions): void;

  /**
   * 获得本地图片
   * 只在 iOS WKWebview 下提供，用于兼容 iOS WKWebview 不支持 localId 直接显示图片的问题
   * @param options
   */
  function getLocalImgData(options: getLocalImgDataOptions): void;

  /**
   * 开始录音
   */
  function startRecord(options: callback): void;

  /**
   * 停止录音
   * @param options
   */
  function stopRecord(options: callback): void;

  /**
   * 监听录音自动停止
   * @param options
   */
  function onVoiceRecordEnd(options: callback): void;

  /**
   * 播放语音
   * @param options
   */
  function playVoice(options: playVoiceOptions): void;

  /**
   * 暂停播放音频
   * @param options
   */
  function pauseVoice(options: pauseVoiceOptions): void;

  /**
   * 停止播放音频
   * @param options
   */
  function stopVoice(options: stopVoiceOptions): void;

  /**
   * 监听语音播放完毕
   * @param options
   */
  function onVoicePlayEnd(options: callback): void;

  /**
   * 上传语音
   * @param options
   */
  function uploadVoice(options: uploadVoiceOptions): void;

  /**
   * 下载语音
   * @param options
   */
  function downloadVoice(options: downloadVoiceOptions): void;

  /**
   * 识别音频并返回识别结果
   * @param options
   */
  function translateVoice(options: translateVoiceOptions): void;

  /**
   * 获得网络状态
   * @param options
   */
  function getNetworkType(options: callback): void;

  /**
   * 使用微信内置地图查看位置
   * @param options
   */
  function openLocation(options: openLocationOptions): void;

  /**
   * 获取地理位置
   * @param options
   */
  function getLocation(options: getLocationOptions): void;

  /**
   * 开启查找周边ibeacon设备
   * @param options
   */
  function startSearchBeacons(options: startSearchBeaconsOptions): void;

  /**
   * 关闭查找周边ibeacon设备
   * @param options
   */
  function stopSearchBeacons(options: callback): void;

  /**
   * 监听周边ibeacon设备
   * @param options
   */
  function onSearchBeacons(options: callback): void;

  /**
   * 关闭当前网页
   */
  function closeWindow(): void;

  /**
   * 批量隐藏功能按钮
   * @param options
   */
  function hideMenuItems(options: hideMenuItemsOptions): void;

  /**
   * 批量显示功能按钮
   * @param options
   */
  function showMenuItems(options: showMenuItemsOptions): void;

  /**
   * 隐藏所有非基础按钮
   * @param options
   */
  function hideAllNonBaseMenuItem(options?: callback): void;

  /**
   * 显示所有功能按钮
   * @param options
   */
  function showAllNonBaseMenuItem(options: callback): void;

  /**
   * 调起微信扫一扫
   * @param options
   */
  function scanQRCode(options: scanQRCodeOptions): void;

  /**
   * 跳转微信商品页
   * @param options
   */
  function openProductSpecificView(options: openProductSpecificViewOptions): void;

  /**
   * 拉取适用卡券列表
   * @param options
   */
  function chooseCard(options: chooseCardOptions): void;

  /**
   * 批量添加卡券
   * @param options
   */
  function addCard(options: addCardOptions): void;

  /**
   * 查看微信卡包中的卡券
   * @param options
   */
  function openCard(options: openCardOptions): void;

  /**
   * 发起一个微信支付请求
   * @param options
   */
  function chooseWXPay(options: chooseWxPayOptions): void;

  /**
   * 共享收货地址
   * @param options
   */
  function openAddress(options: callback): void;
}
