import Mobile from "./plugins/mobile";
import WebDebugger from "./plugins/web-debugger";
import Umshare from "./plugins/umshare";
import BarcodeScanner from "./plugins/barcode-scanner";

export interface Result {
  code: number,
  message?: string,
  data?: any
}

export interface Args {
  /** 成功回调 */
  success: (data: any) => void,
  /** 失败回调 */
  fail: (result: Result) => void,
  /** 完成回调 */
  complete?: (result: Result) => void,
}

type ParameterType<T> = {
  [P in keyof T]: T[P];
} & Args;

export interface MTLCore {
  loadPlugin(plugin: any): void,
  navigateTo(args: Args): void,
  redirectTo(args: Args): void,
  navigateBack(args: Args): void,

  /** 拍照或从手机相册中选图接口 */
  chooseImage(o: ParameterType<{
    /** 选择图片数量，默认9 */
    count: number,
    /** 可以指定来源是相册还是相机，默认二者都有 ["album", "camera"] */
    sourceType: string[]
  }>): void,

  previewImage(args: Args): void,
  uploadImage(args: Args): void,
  downloadImage(args: Args): void,
  getLocalImgSrc(args: Args): void,
  getLocalImgData(args: Args): void,
  scanQRCode(o: ParameterType<{
    /** 可以指定来源是相册还是相机，默认二者都有 ["album", "camera"] */
    scanType?: string[],
    /** 默认为0，扫描结果由端上处理，1则直接返回扫描结果 */
    needResult?: number,
    /** 默认为1。1:单次扫描，n多次扫描（微信只支持单扫 */
    type?: number
  }>): void,
  closeScanQRCode(args: Args): void,
  generateQRCode(args: Args): void,
  getNetworkType(args: Args): void,
  translateVoice(args: Args): void,
  startRecord(args: Args): void,
  stopRecord(args: Args): void,
  onVoiceRecordEnd(args: Args): void,
  playVoice(args: Args): void,
  stopVoice(args: Args): void,
  pauseVoice(args: Args): void,
  onVoicePlayEnd(args: Args): void,
  uploadVoice(args: Args): void,
  downloadVoice(args: Args): void,
  openLocation(args: Args): void,
  getLocation(args: Args): void,
  initFace(args: Args): void,
  faceRegister(args: Args): void,
  faceVerify(args: Args): void,
  scanInvoice(o: ParameterType<{
    /** 路径 */
    url?: string,
    /** apicode */
    appCode?: string | number
  }>): void,
  recognizeInvoice(args: Args): void,
  scanIDCard(o: ParameterType<{
    /** 路径 */
    url?: string,
    /** apicode */
    appCode?: string | number,
    side?: string
  }>): void,
  recognizeIDCard(args: Args): void,
  scanBankCard(o: ParameterType<{
    /** 路径 */
    url?: string,
    /** apicode */
    appCode?: string | number
  }>): void,
  recognizeBankCard(args: Args): void,
  initSpeech(args: Args): void,
  openSpeechPage(args: Args): void,
  startSpeechSyn(args: Args): void,
  stopSpeechSyn(args: Args): void,
  startSpeechRecog(args: Args): void,
  stopSpeechRecog(args: Args): void,
  releaseSpeech(args: Args): void,
  cancelAITask(args: Args): void,
  request(args: Args): void,
  setStorage(args: Args): void,
  getStorage(args: Args): void,
  removeStorage(args: Args): void,
  clearStorage(args: Args): void,
  confirm(args: Args): void,
  canBack(args: Args): void,
  back(args: Args): void,
  deleteWebCache(args: Args): void,
  openWebview(args: Args): void,
  getDeviceModel(args: Args): void,
  getVendor(args: Args): void,
  dail(args: Args): void,
  getOSVersion(args: Args): void,
  uploadFile(args: Args): void,
  downFile(args: Args): void,
  getAppInfo(args: Args): void,
}

export interface MTL extends MTLCore {
  mobile: Mobile,
	webDebugger: WebDebugger,
	umshare: Umshare,
	barcodeScanner: BarcodeScanner,
}