const jsonrpc = {};

jsonrpc.call = function(
  connectionString,
  method,
  params,
  callback,
  errorCallback,
  connectFailedCallback,
  timeout
) {
  var xhr = new XMLHttpRequest();
  if (typeof connectFailedCallback !== "undefined") {
    if (timeout) {
      xhr.timeout = timeout;
    }

    xhr.addEventListener("error", function(e) {
      connectFailedCallback(e);
    });
    xhr.addEventListener("timeout", function() {
      connectFailedCallback(
        new Error(__("XMLHttpRequest connection timed out"))
      );
    });
  }
  xhr.addEventListener("load", function() {
    var response = JSON.parse(xhr.responseText);

    if (response.error) {
      if (errorCallback) {
        errorCallback(response.error);
      } else {
        var errorEvent = new CustomEvent("unhandledError", {
          detail: {
            connectionString: connectionString,
            method: method,
            params: params,
            code: response.error.code,
            message: response.error.message,
            data: response.error.data,
          },
        });
        document.dispatchEvent(errorEvent);
      }
    } else if (callback) {
      callback(response.result);
    }
  });

  if (connectFailedCallback) {
    xhr.addEventListener("error", function(event) {
      connectFailedCallback(event);
    });
  } else {
    xhr.addEventListener("error", function(event) {
      var errorEvent = new CustomEvent("unhandledError", {
        detail: {
          connectionString: connectionString,
          method: method,
          params: params,
          code: xhr.status,
          message: __("Connection to API server failed"),
        },
      });
      document.dispatchEvent(errorEvent);
    });
  }

  const counter = parseInt(sessionStorage.getItem("JSONRPCCounter") || 0);

  xhr.open("POST", connectionString, true);
  xhr.send(
    JSON.stringify({
      jsonrpc: "2.0",
      method: method,
      params: params,
      id: counter,
    })
  );

  sessionStorage.setItem("JSONRPCCounter", counter + 1);

  return xhr;
};

export default jsonrpc;