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

"use strict";

// Test that adding a device, submitting it, and then editing it updates the device's
// original values when it is saved.

const TEST_URL = "data:text/html;charset=utf-8,";

const device = {
  name: "Original Custom Device",
  width: 320,
  height: 480,
  pixelRatio: 1,
  userAgent: "Mozilla/5.0 (Mobile; rv:39.0) Gecko/39.0 Firefox/39.0",
  touch: false,
};

const newDevice = {
  name: "Edited Custom Device",
  width: 300,
  height: 900,
  pixelRatio: 4,
  userAgent: "Different User agent",
  touch: true,
};

addRDMTask(
  TEST_URL,
  async function ({ ui }) {
    const { toolWindow } = ui;
    const { document } = toolWindow;

    await openDeviceModal(ui);

    info("Add device.");
    const adderShow = document.querySelector("#device-add-button");
    adderShow.click();
    await addDeviceInModal(ui, device);

    info("Submit the added device.");
    let deviceSelector = document.getElementById("device-selector");
    document.getElementById("device-close-button").click();

    await testMenuItems(toolWindow, deviceSelector, menuItems => {
      const originalDevice = findMenuItem(menuItems, device.name);
      ok(originalDevice, "Original custom device menu item exists.");
    });

    info("Select the added device in menu.");
    await selectDevice(ui, "Custom Device");
    await openDeviceModal(ui);

    info("Edit the device.");
    const editorShow = document.querySelector(
      ".device-type-custom #device-edit-button"
    );
    editorShow.click();
    await editDeviceInModal(ui, device, newDevice);

    info("Ensure the edited device name is updated in the custom device list.");
    const customDevicesList = document.querySelector(".device-type-custom");
    const editedCustomDevice = customDevicesList.querySelector(".device-name");
    is(
      editedCustomDevice.textContent,
      newDevice.name,
      `${device.name} is updated to ${newDevice.name} in the custom device list`
    );

    info("Ensure the viewport width and height are updated in the toolbar.");
    const [width, height] = document.querySelectorAll(
      ".text-input.viewport-dimension-input"
    );
    is(width.value, "300", "Viewport width is 300");
    is(height.value, "900", "Viewport height is 900");

    info("Ensure the pixel ratio is updated in the toolbar.");
    const devicePixelRatioSpan = document.querySelector(
      "#device-pixel-ratio-menu span"
    );
    is(
      devicePixelRatioSpan.textContent,
      "DPR: 4",
      "Viewport pixel ratio is 4."
    );

    info("Ensure the user agent has been updated.");
    const userAgentInput = document.querySelector("#user-agent-input");
    is(
      userAgentInput.value,
      newDevice.userAgent,
      `Viewport user agent is ${newDevice.userAgent}`
    );

    info("Ensure touch simulation has been updated");
    const touchSimulation = document.querySelector("#touch-simulation-button");
    ok(
      touchSimulation.classList.contains("checked"),
      "Viewport touch simulation is enabled."
    );

    info(
      "Ensure the edited device is updated in the device selector when submitted"
    );
    document.getElementById("device-close-button").click();
    deviceSelector = document.getElementById("device-selector");

    await testMenuItems(toolWindow, deviceSelector, menuItems => {
      const originalDevice = findMenuItem(menuItems, device.name);
      const editedDevice = findMenuItem(menuItems, newDevice.name);
      ok(!originalDevice, "Original custom device menu item does not exist");
      ok(editedDevice, "Edited Custom Device menu item exists");
    });
  },
  { waitForDeviceList: true }
);
