import { Timer } from '..';
import Bridge from '../manager/BridgeManager'
import { BridgeParams } from '../types/type'
import { 
  CoolinkHttpRequestParam, 
  CoolinkRetHttp, 
  CoolinkRegisterMessageReceiverParams,
  CoolinkRetGetOfficialDomain 
} from './type'
import mpWeb from './MpWeb';

class NetworkModule {
  private static instance: NetworkModule;

  public static getModule(): NetworkModule {
    if (this.instance == null) {
      this.instance = new NetworkModule()
    }
    return NetworkModule.instance
  }

  private doHttp(bridgeParams) : Promise<CoolinkRetHttp> {
    return new Promise<CoolinkRetHttp>((resolve) => {
      let isTimeout = false;
      //
      let timeoutHandler: string = Timer.setTimeout(() => {
        isTimeout = true;
        let timeoutRet = {
          code: 0,
          httpCode: 504,
          content: JSON.stringify({
            code: -1,
            msg: 'timeout 20s'
          })
        };
        resolve(timeoutRet);
      }, 20 * 1000);   // set 20s  timeout
      ///////////////////////////////////////////////////
      mpWeb.callNative(bridgeParams)
        .then((httpRet) => {
          Timer.clearTimer(timeoutHandler);
          resolve(httpRet);
        });
    })
  }

  public httpRequest(param1: CoolinkHttpRequestParam) : Promise<CoolinkRetHttp> {
    let bridgeParams : BridgeParams = {
      module: 'network',
      method: 'httpRequest',
      params: param1
    };
    return this.doHttp(bridgeParams);
  }
  
  public registerNetworkChanged(obj: CoolinkRegisterMessageReceiverParams) : void {
    let bridgeParams : BridgeParams = {
      module: 'network',
      method: 'registerNetworkChanged',
      params: {
        miniAppCode: obj.miniAppCode,
        methodName: 'onNetworkChanged',
      }
    };
    mpWeb.callNativeWithPersistentCallBack(bridgeParams, 'onNetworkChanged', obj.callback);
  }

  public getOfficialDomain(domain: string) : Promise<CoolinkRetGetOfficialDomain> {
    let bridgeParams : BridgeParams = {
      module: 'network',
      method: 'getOfficialDomain',
      params: {
        domain
      }
    };
    return mpWeb.callNative(bridgeParams);
  }

}

export default NetworkModule;
