.download.hidden
  = link_to t("admin.reports.download.button"), file_url, target: "_blank", class: "button icon icon-file"

:javascript
  (function () {
    const tryDownload = function() {
      const link = document.querySelector(".download a");

      // If the report was already rendered via web sockets:
      if (link == null) return;

      fetch(link.href).then((response) => {
        if (response.ok) {
          response.blob().then((blob) => blob.text()).then((text) => {
            const loading = document.querySelector(".loading");

            if (loading == null) return;

            loading.remove();
            document.querySelector("#report-go button").disabled = false;

            if (link.href.endsWith(".html")) {
              // This replaces the hidden download button with the report:
              link.parentElement.outerHTML = text;
            } else {
              // Or just show the download button when it's ready:
              document.querySelector(".download").classList.remove("hidden")
            }
          });
        } else {
          setTimeout(tryDownload, 2000);
        }
      });
    }

    /*
      A lot of reports are rendered within 250ms. Others take at least
      2.5 seconds. There's a big gap in between. Observed on:
      https://openfoodnetwork.org.au/admin/sidekiq/metrics/ReportJob?period=8h
      https://openfoodnetwork.org.uk/admin/sidekiq/metrics/ReportJob?period=8h
      https://coopcircuits.fr/admin/sidekiq/metrics/ReportJob?period=8h

      But let's leave the timed response to websockets for now and just poll
      as a backup mechanism.
    */
    setTimeout(tryDownload, 3000);
  })();
