/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

const RUNTIME_NAME = "Firefox 123";
const DEVICE_NAME = "DEVICE_NAME";
const DEVICE_ID = "DEVICE_ID";
const RUNTIME_ID = "RUNTIME_ID";

// Test that unavailable runtimes:
// - are displayed without a connect button.
// - cannot be selected
// - display a specific text ("Waiting for runtime") instead of the runtime name
add_task(async function () {
  const mocks = new Mocks();
  const { document, tab } = await openAboutDebugging();

  info("Create a device without a corresponding runtime");
  mocks.addDevice(DEVICE_ID, DEVICE_NAME);
  mocks.emitUSBUpdate();

  info("Wait until the USB sidebar item appears");
  await waitUntil(() => findSidebarItemByText(DEVICE_NAME, document));

  const usbRuntimeSidebarItem = findSidebarItemByText(DEVICE_NAME, document);

  ok(
    usbRuntimeSidebarItem.querySelector(".qa-runtime-item-waiting-for-browser"),
    "Sidebar item shows as `Waiting for browser`"
  );

  const hasConnectButton =
    usbRuntimeSidebarItem.querySelector(".qa-connect-button");
  ok(!hasConnectButton, "Connect button is not displayed");

  const hasLink = usbRuntimeSidebarItem.querySelector(".qa-sidebar-link");
  ok(!hasLink, "Unavailable runtime is not selectable");

  info("Add a valid runtime for the same device id and emit update event");
  mocks.createUSBRuntime(RUNTIME_ID, {
    deviceId: DEVICE_ID,
    deviceName: DEVICE_NAME,
    shortName: RUNTIME_NAME,
  });
  mocks.removeDevice(DEVICE_ID);
  mocks.emitUSBUpdate();

  info("Wait until connect button appears for the USB runtime");
  let updatedSidebarItem = null;
  await waitUntil(() => {
    updatedSidebarItem = findSidebarItemByText(DEVICE_NAME, document);
    return (
      updatedSidebarItem &&
      updatedSidebarItem.querySelector(".qa-connect-button")
    );
  });

  ok(
    updatedSidebarItem.querySelector(".qa-runtime-item-standard"),
    "Sidebar item for the USB runtime is now a standard sidebar item"
  );

  await removeTab(tab);
});
