import Bridge from '../manager/BridgeManager'
import { BridgeParams } from '../types/type'
import { 
  CoolinkRetCode, 
  CoolinkInitFloatWinParams, 
  CoolinkRegisterMessageReceiverParams, 
  CoolinkIsMpForegroundRet ,
  CoolinkRegisterMoreInfoParams,
} from './type'
import RenderManager from '../../src/manager/RenderManager'
import {PageInfo} from '../../src/types/type'
import mpWeb from './MpWeb';

class NativeUIModule {
  private static instance: NativeUIModule;

  public static getModule(): NativeUIModule {
    if (this.instance == null) {
      this.instance = new NativeUIModule()
    }
    return NativeUIModule.instance
  }

  public startPay(orderParams: string) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'startPay',
      params: {
        orderParams
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public alterConnect() : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'alterConnect',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public captureScreen() : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'captureScreen',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public startSpeech() : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'startSpeech',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public stopSpeech() : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'stopSpeech',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public notifyCurrPageShow(pageName: string = '') : Promise<CoolinkRetCode> {
    let name;
    if (pageName == '') {
      let currPage = RenderManager.currentPage as PageInfo;
      name = currPage.pageName;
    } else {
      name = pageName;
    }
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'notifyCurrPageShow',
      params: {
        pageName: name
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public notifyCurrTheme(theme: string) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'notifyCurrTheme',
      params: {
        theme
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public showNeedHighVerDialog() : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'showNeedHighVerDialog',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public setFloatWinDisplay(show: boolean) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'setFloatWinDisplay',
      params: {
        show
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public initFloatWin(obj: CoolinkInitFloatWinParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'initFloatWin',
      params: {
        ...obj,
        methodName: 'onTapFloatWin',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onTapFloatWin', obj.callback);
  }

  public registerCloseBtnPress(obj: CoolinkRegisterMessageReceiverParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'registerCloseBtnPress',
      params: {
        miniAppCode: obj.miniAppCode,
        methodName: 'onCloseBtnPress',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onCloseBtnPress', obj.callback);
  }

  public showAppletWin(miniAppCode: string) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'showAppletWin',
      params: {
        miniAppCode
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public showConnectDeviceDialog () : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'showConnectDeviceDialog',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public isMpForeground(miniAppCode: string) : Promise<CoolinkIsMpForegroundRet> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'isMpForeground',
      params: {
        miniAppCode: miniAppCode
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public showNotification (miniAppCode: string, text: string, title: string) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'showNotification',
      params: {
        miniAppCode: miniAppCode,
        text: text,
        title: title ? title : ''
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public registerLifecycleChanged(obj: CoolinkRegisterMessageReceiverParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'registerLifecycleChanged',
      params: {
        miniAppCode: obj.miniAppCode,
        methodName: 'onLifecycleChanged',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onLifecycleChanged', obj.callback);
  }

  public registerMoreInfo(obj: CoolinkRegisterMoreInfoParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'registerMoreInfo',
      params: {
        miniAppCode: obj.miniAppCode,
        moreIcon: obj.moreIcon,
        methodName: 'onMoreInfo',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onMoreInfo', obj.callback);
  }

  public invokeRemoteController (remoteType : number) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'nativeui',
      method: 'invokeRemoteController',
      params: {
        remoteType
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

}

export default NativeUIModule;
