import Taro from '../../index'

declare module '../../index' {
  namespace stopBackgroundAudio {
    interface Option {
      /** 接口调用结束的回调函数（调用成功、失败都会执行） */
      complete?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用失败的回调函数 */
      fail?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用成功的回调函数 */
      success?: (res: TaroGeneral.CallbackResult) => void
    }
  }

  namespace seekBackgroundAudio {
    interface Option {
      /** 音乐位置，单位：秒 */
      position: number
      /** 接口调用结束的回调函数（调用成功、失败都会执行） */
      complete?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用失败的回调函数 */
      fail?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用成功的回调函数 */
      success?: (res: TaroGeneral.CallbackResult) => void
    }
  }

  namespace playBackgroundAudio {
    interface Option {
      /** 音乐链接，目前支持的格式有 m4a, aac, mp3, wav */
      dataUrl: string
      /** 接口调用结束的回调函数（调用成功、失败都会执行） */
      complete?: (res: TaroGeneral.CallbackResult) => void
      /** 封面URL */
      coverImgUrl?: string
      /** 接口调用失败的回调函数 */
      fail?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用成功的回调函数 */
      success?: (res: TaroGeneral.CallbackResult) => void
      /** 音乐标题 */
      title?: string
    }
  }

  namespace pauseBackgroundAudio {
    interface Option {
      /** 接口调用结束的回调函数（调用成功、失败都会执行） */
      complete?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用失败的回调函数 */
      fail?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用成功的回调函数 */
      success?: (res: TaroGeneral.CallbackResult) => void
    }
  }

  namespace getBackgroundAudioPlayerState {
    interface Option {
      /** 接口调用结束的回调函数（调用成功、失败都会执行） */
      complete?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用失败的回调函数 */
      fail?: (res: TaroGeneral.CallbackResult) => void
      /** 接口调用成功的回调函数 */
      success?: (result: SuccessCallbackResult) => void
    }
    interface SuccessCallbackResult extends TaroGeneral.CallbackResult {
      /** 选定音频的播放位置（单位：s），只有在音乐播放中时返回 */
      currentPosition: number
      /** 歌曲数据链接，只有在音乐播放中时返回 */
      dataUrl: string
      /** 音频的下载进度百分比，只有在音乐播放中时返回 */
      downloadPercent: number
      /** 选定音频的长度（单位：s），只有在音乐播放中时返回 */
      duration: number
      /** 播放状态 */
      status: keyof Status
      /** 调用结果 */
      errMsg: string
    }
    interface Status {
      /** 暂停中 */
      0
      /** 播放中 */
      1
      /** 没有音乐播放 */
      2
    }
  }

  /** BackgroundAudioManager 实例，可通过 [Taro.getBackgroundAudioManager](/docs/apis/media/background-audio/getBackgroundAudioManager) 获取。
   * @example
   * ```tsx
   * const backgroundAudioManager = Taro.getBackgroundAudioManager()
   * backgroundAudioManager.title = '此时此刻'
   * backgroundAudioManager.epname = '此时此刻'
   * backgroundAudioManager.singer = '许巍'
   * backgroundAudioManager.coverImgUrl = 'https://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000'
   * // 设置了 src 之后会自动播放
   * backgroundAudioManager.src = 'https://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46'
   * ```
   * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.html
   */
  interface BackgroundAudioManager {
    /** 音频的数据源（[2.2.3](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 开始支持云文件ID）。默认为空字符串，**当设置了新的 src 时，会自动开始播放**，目前支持的格式有 m4a, aac, mp3, wav。 */
    src: string
    /** 音频开始播放的位置（单位：s）。 */
    startTime: number
    /** 音频标题，用于原生音频播放器音频标题（必填）。原生音频播放器中的分享功能，分享出去的卡片标题，也将使用该值。 */
    title: string
    /** 专辑名，原生音频播放器中的分享功能，分享出去的卡片简介，也将使用该值。 */
    epname: string
    /** 歌手名，原生音频播放器中的分享功能，分享出去的卡片简介，也将使用该值。 */
    singer: string
    /** 封面图 URL，用于做原生音频播放器背景图。原生音频播放器中的分享功能，分享出去的卡片配图及背景也将使用该图。 */
    coverImgUrl: string
    /** 页面链接，原生音频播放器中的分享功能，分享出去的卡片简介，也将使用该值。 */
    webUrl: string
    /** 音频协议。默认值为 'http'，设置 'hls' 可以支持播放 HLS 协议的直播音频。 */
    protocol: string
    /** 播放速度。范围 0.5-2.0。
     * @default 1
     */
    playbackRate?: number
    /** 当前音频的长度（单位：s），只有在有合法 src 时返回。
     * @readonly
     */
    duration: number
    /** 当前音频的播放位置（单位：s），只有在有合法 src 时返回。
     * @readonly
     */
    currentTime: number
    /** 当前是否暂停或停止。
     * @readonly
     */
    paused: boolean
    /** 音频已缓冲的时间，仅保证当前播放时间点到此时间点内容已缓冲。
     * @readonly
     */
    buffered: number
    /** origin: 发送完整的 referrer; no-referrer: 不发送 */
    referrerPolicy?: 'origin' | 'no-referrer' | string
    /** 播放 */
    play(): void
    /** 暂停 */
    pause(): void
    /** 跳转到指定位置，单位 s */
    seek(position: any): void
    /** 停止 */
    stop(): void
    /** 背景音频进入可以播放状态，但不保证后面可以流畅播放 */
    onCanplay(callback?: () => void): void
    /** 音频加载中事件，当音频因为数据不足，需要停下来加载时会触发 */
    onWaiting(callback?: () => void): void
    /** 背景音频播放错误事件 */
    onError(callback?: () => void): void
    /** 背景音频播放事件 */
    onPlay(callback?: () => void): void
    /** 背景音频暂停事件 */
    onPause(callback?: () => void): void
    /** 背景音频开始跳转操作事件 */
    onSeeking(callback?: () => void): void
    /** 背景音频完成跳转操作事件 */
    onSeeked(callback?: () => void): void
    /** 背景音频自然播放结束事件 */
    onEnded(callback?: () => void): void
    /** 背景音频停止事件 */
    onStop(callback?: () => void): void
    /** 背景音频播放进度更新事件 */
    onTimeUpdate(callback?: () => void): void
    /** 用户在系统音乐播放面板点击上一曲事件（iOS only） */
    onPrev(callback?: () => void): void
    /** 用户在系统音乐播放面板点击下一曲事件（iOS only） */
    onNext(callback?: () => void): void
  }

  interface TaroStatic {
    /**
     * 停止播放音乐。
     * @supported weapp
     * @example
     * ```tsx
     * Taro.stopBackgroundAudio()
     * ```
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.stopBackgroundAudio.html
     */
    stopBackgroundAudio(option?: stopBackgroundAudio.Option): void

    /** 控制音乐播放进度。
     * @supported weapp
     * @example
     * ```tsx
     * Taro.seekBackgroundAudio({
     *   position: 30
     * })
     * ```
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.seekBackgroundAudio.html
     */
    seekBackgroundAudio(option: seekBackgroundAudio.Option): Promise<TaroGeneral.CallbackResult>

    /** 使用后台播放器播放音乐，对于微信客户端来说，只能同时有一个后台音乐在播放。当用户离开小程序后，音乐将暂停播放；当用户点击“显示在聊天顶部”时，音乐不会暂停播放；当用户在其他小程序占用了音乐播放器，原有小程序内的音乐将停止播放。
     * @supported weapp
     * @example
     * ```tsx
     * Taro.playBackgroundAudio({
     *   dataUrl: '',
     *   title: '',
     *   coverImgUrl: ''
     * })
     * ```
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.playBackgroundAudio.html
     */
    playBackgroundAudio(option: playBackgroundAudio.Option): Promise<TaroGeneral.CallbackResult>

    /** 暂停播放音乐。
     * @supported weapp
     * @example
     * ```tsx
     * Taro.pauseBackgroundAudio()
     * ```
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.pauseBackgroundAudio.html
     */
    pauseBackgroundAudio(option?: pauseBackgroundAudio.Option): void

    /** 监听音乐停止。
     *
     * **bug & tip：**
     *
     * 1.  `bug`: `iOS` `6.3.30` Taro.seekBackgroundAudio 会有短暂延迟
     * @supported weapp
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.onBackgroundAudioStop.html
     */
    onBackgroundAudioStop(
      /** 音乐停止事件的回调函数 */
      callback: (res: TaroGeneral.CallbackResult) => void,
    ): void

    /** 监听音乐播放。
     * @supported weapp
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.onBackgroundAudioPlay.html
     */
    onBackgroundAudioPlay(
      /** 音乐播放事件的回调函数 */
      callback: (res: TaroGeneral.CallbackResult) => void,
    ): void

    /** 监听音乐暂停。
     * @supported weapp
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.onBackgroundAudioPause.html
     */
    onBackgroundAudioPause(
      /** 音乐暂停事件的回调函数 */
      callback: (res: TaroGeneral.CallbackResult) => void,
    ): void

    /** 获取后台音乐播放状态。
     * **注意：1.2.0 版本开始，本接口不再维护。建议使用能力更强的 [Taro.getBackgroundAudioManager](/docs/apis/media/background-audio/getBackgroundAudioManager) 接口**
     * @supported weapp
     * @example
     * ```tsx
     * Taro.getBackgroundAudioPlayerState({
     *   success: function (res) {
     *     var status = res.status
     *     var dataUrl = res.dataUrl
     *     var currentPosition = res.currentPosition
     *     var duration = res.duration
     *     var downloadPercent = res.downloadPercent
     *   }
     * })
     * ```
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioPlayerState.html
     */
    getBackgroundAudioPlayerState(option?: getBackgroundAudioPlayerState.Option): Promise<getBackgroundAudioPlayerState.SuccessCallbackResult>

    /** 获取**全局唯一**的背景音频管理器。
     * 小程序切入后台，如果音频处于播放状态，可以继续播放。但是后台状态不能通过调用API操纵音频的播放状态。
     *
     * 从微信客户端6.7.2版本开始，若需要在小程序切后台后继续播放音频，需要在 [app.json](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html) 中配置 `requiredBackgroundModes` 属性。开发版和体验版上可以直接生效，正式版还需通过审核。
     * @supported weapp, tt, harmony_hybrid
     * @example
     * ```tsx
     * const backgroundAudioManager = Taro.getBackgroundAudioManager()
     * backgroundAudioManager.title = '此时此刻'
     * backgroundAudioManager.epname = '此时此刻'
     * backgroundAudioManager.singer = '许巍'
     * backgroundAudioManager.coverImgUrl = 'https://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000'
     * backgroundAudioManager.src = 'https://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46' // 设置了 src 之后会自动播放
     * ```
     * @see https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html
     */
    getBackgroundAudioManager(): BackgroundAudioManager
  }
}
