import Bridge from '../manager/BridgeManager'
import { BridgeParams } from '../types/type'
import { 
  CoolinkRetCode, 
  CoolinkStartActionParams,
  CoolinkVibrateDeviceParams,
  CoolinkCommonReceiverParams,
  CoolinkStartWechatAppletParam,
} from './type'
import mpWeb from './MpWeb';

class SystemModule {
  private static instance: SystemModule;

  public static getModule(): SystemModule {
    if (this.instance == null) {
      this.instance = new SystemModule()
    }
    return SystemModule.instance
  }

  public exitCurrPage() : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'system',
      method: 'exitCurrPage',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public startAction(params: CoolinkStartActionParams) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'system',
      method: 'startAction',
      params: {
        ...params
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public vibrateDevice(params: CoolinkVibrateDeviceParams) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'system',
      method: 'vibrateDevice',
      params: {
        ...params
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public playKeySound() : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'system',
      method: 'playKeySound',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public registerDeviceShake(obj: CoolinkCommonReceiverParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'system',
      method: 'registerDeviceShake',
      params: {
        methodName: 'onDeviceShake',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onDeviceShake', obj.callback);
  }

  public startWechatApplet(params: CoolinkStartWechatAppletParam) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'system',
      method: 'startWechatApplet',
      params: {
        ...params
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

}

export default SystemModule;
