import Bridge from '../manager/BridgeManager'
import { BridgeParams } from '../types/type'
import cooInfo from '../shared/cooInfo'
import { 
  CoolinkRetCode, 
  CoolinkRetConnectId, 
  CoolinkRetIsConnected, 
  CoolinkRetDeviceList, 
  CoolinkRetRemoteDevice,
  CoolinkSendMessageParams,
  CoolinkRegisterMessageReceiverParams,
  CoolinkStartActionParams,
  CoolinkGetRemoteAppStateParams,
  CoolinkRetState,
  CoolinkCommonReceiverParams,
  CoolinkRetHttpHostMapping,
} from './type'
import mpWeb from './MpWeb';

class ProtocolModule {
  private static instance: ProtocolModule;
  public static msgcallback: Function = null;

  public static getModule(): ProtocolModule {
    if (this.instance == null) {
      this.instance = new ProtocolModule()
    }
    return ProtocolModule.instance
  }

  public getConnectId() : Promise<CoolinkRetConnectId> {
    let methodName: string;
    if ((cooInfo?.infos?.systemInfo?.os.indexOf('android') >= 0)) {
      methodName = 'getConnectedId';
    } else {
      methodName = 'getConnectId';
    }
    //
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: methodName,
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public isConnected() : Promise<CoolinkRetIsConnected> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'isConnected',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public getDeviceList() : Promise<CoolinkRetDeviceList> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'getDeviceList',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public getRemoteDeviceInfo() : Promise<CoolinkRetRemoteDevice> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'getRemoteDeviceInfo',
      params: {
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public sendMessage(obj: CoolinkSendMessageParams) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'sendMessage',
      params: {
        ...obj
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public sendKey(keycode: number) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'sendKey',
      params: {
        keycode: keycode
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public registerMessageReceiver(obj: CoolinkRegisterMessageReceiverParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'registerMessageReceiver',
      params: {
        miniAppCode: obj.miniAppCode,
        methodName: 'onMessageReceiver',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onMessageReceiver', obj.callback);
  }

  public registerMessageProcessor(callback: Function) : void {
    ProtocolModule.msgcallback = callback;
  }

  public invokeRemoteIntent(param: CoolinkStartActionParams) : Promise<CoolinkRetCode> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'invokeRemoteIntent',
      params: {
        ...param
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public getRemoteAppState(param: CoolinkGetRemoteAppStateParams) : Promise<CoolinkRetState> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'getRemoteAppState',
      params: {
        ...param
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

  public registerConnectChanged(obj: CoolinkRegisterMessageReceiverParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'registerConnectChanged',
      params: {
        miniAppCode: obj.miniAppCode,
        methodName: 'onConnectChanged',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onConnectChanged', obj.callback);
  }

  public generateHttpP2PHostMapping(filePath:String)  : Promise<CoolinkRetHttpHostMapping> {
    let bridgeParams : BridgeParams = {
      module: 'protocol',
      method: 'generateHttpP2PHostMapping',
      params: {
        path:filePath
      }
    };
    return mpWeb.callNative(bridgeParams);
}

}

export default ProtocolModule;
