<import src="/mojo/public/sky/core.sky" as="core" />
<import src="/mojo/public/sky/unicode.sky" as="unicode" />
<import src="/mojo/services/public/interfaces/network/network_service.mojom.sky" as="net" />
<import src="/mojo/services/public/interfaces/network/url_loader.mojom.sky" as="loader" />
<import src="shell.sky" as="shell" />
<script>
function XMLHttpRequest() {
  this.networkService_ = shell.connectToService(
    "mojo:network_service", net.NetworkService);
  this.request_ = null;
  this.loader_ = null;
  this.responseText = null;
  this.headers_ = new Map();
};

XMLHttpRequest.prototype.onload = function() { };
XMLHttpRequest.prototype.onerror = function(error) { };

XMLHttpRequest.prototype.open = function(method, url) {
  this.request_ = new loader.URLRequest();
  this.request_.url = url;
  this.request_.method = method;
  this.request_.auto_follow_redirects = true;
  this.headers_.clear();
};

XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
  this.headers_.set(header, value);
};

XMLHttpRequest.prototype.send = function() {
  var requestHeaders = [];
  this.headers_.forEach(function(value, key) {
    requestHeaders.push(key + ': ' + value);
  });
  this.request_.headers = requestHeaders;

  // FIXME: Factor this into the JS bindings.
  var pipe = new core.createMessagePipe();
  this.networkService_.createURLLoader(pipe.handle1);
  this.loader_ = shell.wrapHandle(pipe.handle0, loader.URLLoader);

  var self = this;
  this.loader_.start(this.request_).then(function(result) {
    return core.drainData(result.response.body).then(function(result) {
      self.responseText = unicode.decodeUtf8String(new Uint8Array(result.buffer));
      self.onload();
    });
  }).catch(function(error) {
    self.onerror(error);
  });
};

module.exports = XMLHttpRequest;
</script>
