#!mojo mojo:js_content_handler

define("main", [
  "mojo/services/public/js/application",
  "mojo/public/js/core",
  "mojo/services/network/public/interfaces/network_service.mojom",
  "mojo/services/network/public/interfaces/url_loader.mojom",
  "services/js/test/network_test_service.mojom",
], function(application,
            core,
            networkServiceMojom,
            urlLoaderMojom,
            networkTestServiceMojom) {

  const Application = application.Application;
  const NetworkService = networkServiceMojom.NetworkService;
  const URLRequest = urlLoaderMojom.URLRequest;
  const NetworkTestService = networkTestServiceMojom.NetworkTestService;

  class NetworkTestServiceImpl {
    constructor(app) {
      this.app = app;
      var netService = app.shell.connectToService(
          "mojo:network_service", NetworkService);
      var urlLoader;
      netService.createURLLoader(function(x){urlLoader = x;});
      this.urlLoader = urlLoader;
    }

    getFileSize(url) {
      var impl = this;
      return new Promise(function(resolve) {
        var urlRequest = new URLRequest({
          url: url,
          method: "GET",
          auto_follow_redirects: true
        });
        impl.urlLoader.start(urlRequest).then(function(result) {
          core.drainData(result.response.body).then(
            function(result) {
              resolve({ok: true, size: result.buffer.byteLength});
            });
        }).catch(function() {
          resolve({ok: false});
        });
      });
    }

    quit() {
      this.app.quit();
    }
  }

  class NetworkTest extends Application {
    acceptConnection(url, serviceExchange) {
      serviceExchange.provideService(
          NetworkTestService,
          NetworkTestServiceImpl.bind(null, this));
    }
  }

  return NetworkTest;
});
