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

"use strict";

/* import-globals-from helper-telemetry.js */
Services.scriptloader.loadSubScript(
  CHROME_URL_ROOT + "helper-telemetry.js",
  this
);

const RUNTIME_ID = "test-runtime-id";
const RUNTIME_NAME = "Test Runtime";
const RUNTIME_DEVICE_NAME = "Test Device";

/**
 * Test that runtime specific actions are logged as telemetry events with the expected
 * runtime id and action type.
 */
add_task(async function testUsbRuntimeUpdates() {
  // enable USB devices mocks
  const mocks = new Mocks();
  setupTelemetryTest();

  const { tab, document } = await openAboutDebugging();

  const sessionId = getOpenEventSessionId();
  ok(!isNaN(sessionId), "Open event has a valid session id");

  const usbClient = mocks.createUSBRuntime(RUNTIME_ID, {
    deviceName: RUNTIME_DEVICE_NAME,
    name: RUNTIME_NAME,
    shortName: RUNTIME_NAME,
  });
  mocks.emitUSBUpdate();

  info("Wait for the runtime to appear in the sidebar");
  await waitUntil(() => findSidebarItemByText(RUNTIME_NAME, document));
  await connectToRuntime(RUNTIME_DEVICE_NAME, document);
  await selectRuntime(RUNTIME_DEVICE_NAME, RUNTIME_NAME, document);

  info("Read telemetry events to flush unrelated events");
  const evts = readAboutDebuggingEvents();
  const runtimeAddedEvent = evts.filter(e => e.method === "runtime_added")[0];
  const telemetryRuntimeId = runtimeAddedEvent.extras.runtime_id;

  info("Click on the toggle button and wait until the text is updated");
  const promptButton = document.querySelector(
    ".qa-connection-prompt-toggle-button"
  );
  promptButton.click();
  await waitUntil(() => promptButton.textContent.includes("Enable"));

  checkTelemetryEvents(
    [
      {
        method: "update_conn_prompt",
        extras: { prompt_enabled: "false", runtime_id: telemetryRuntimeId },
      },
    ],
    sessionId
  );

  info("Click on the toggle button again and check we log the correct value");
  promptButton.click();
  await waitUntil(() => promptButton.textContent.includes("Disable"));

  checkTelemetryEvents(
    [
      {
        method: "update_conn_prompt",
        extras: { prompt_enabled: "true", runtime_id: telemetryRuntimeId },
      },
    ],
    sessionId
  );

  info("Open the profiler dialog");
  await openProfilerDialog(usbClient, document);

  checkTelemetryEvents(
    [
      {
        method: "show_profiler",
        extras: { runtime_id: telemetryRuntimeId },
      },
    ],
    sessionId
  );

  info("Remove runtime");
  mocks.removeRuntime(RUNTIME_ID);
  mocks.emitUSBUpdate();
  await waitUntil(() => !findSidebarItemByText(RUNTIME_NAME, document));

  await removeTab(tab);
});
