context("Resource tree notebook file manipulation", () => {
  const timeout = 15000; // in ms
  const explorerUrl =
    "https://localhost:1234/explorer.html?feature.notebookserverurl=https%3A%2F%2Flocalhost%3A10001%2F12345%2Fnotebook&feature.notebookServerToken=token&feature.enablenotebooks=true";

  /**
   * Wait for UI to be ready
   */
  const waitForReady = () => {
    cy.get(".splashScreenContainer", { timeout }).should("be.visible");
  };

  const clickContextMenuAndSelectOption = (nodeLabel, option) => {
    cy.get(`.treeNodeHeader[data-test="${nodeLabel}"]`)
      .find("button.treeMenuEllipsis")
      .click();
    cy.get('[data-test="treeComponentMenuItemContainer"]')
      .contains(option)
      .click();
  };

  const createFolder = folder => {
    clickContextMenuAndSelectOption("My Notebooks/", "New Directory");

    cy.get("#stringInputPane").within(() => {
      cy.get('input[name="collectionIdConfirmation"]').type(folder);
      cy.get("form").submit();
    });
  };

  const deleteItem = nodeName => {
    clickContextMenuAndSelectOption(`${nodeName}`, "Delete");
    cy.get(".ms-Dialog-main")
      .contains("Delete")
      .click();
  };

  beforeEach(() => {
    cy.visit(explorerUrl);
    waitForReady();
  });

  it("Create and remove a directory", () => {
    const folder = "e2etest_folder1";
    createFolder(folder);
    cy.get(`.treeNodeHeader[data-test="${folder}/"]`).should("exist");
    deleteItem(`${folder}/`);
    cy.get(`.treeNodeHeader[data-test="${folder}/"]`).should("not.exist");
  });

  it("Create and rename a directory", () => {
    const folder = "e2etest_folder2";
    const renamedFolder = "e2etest_folder2_renamed";
    createFolder(folder);

    // Rename
    clickContextMenuAndSelectOption(`${folder}/`, "Rename");
    cy.get("#stringInputPane").within(() => {
      cy.get('input[name="collectionIdConfirmation"]')
        .clear()
        .type(renamedFolder);
      cy.get("form").submit();
    });
    cy.get(`.treeNodeHeader[data-test="${renamedFolder}/"]`).should("exist");
    cy.get(`.treeNodeHeader[data-test="${folder}/"]`).should("not.exist");

    deleteItem(`${renamedFolder}/`);
    cy.get(`.treeNodeHeader[data-test="${renamedFolder}/"]`).should("not.exist");
  });

  it("Create a notebook inside a directory", () => {
    const folder = "e2etest_folder3";
    const newNotebookName = "Untitled.ipynb";
    createFolder(folder);
    clickContextMenuAndSelectOption(`${folder}/`, "New Notebook");

    // Verify tab is open
    cy.get(".tabList")
      .contains(newNotebookName)
      .should("exist");

    // Close tab
    cy.get(`.tabList[title="notebooks/${folder}/${newNotebookName}"]`)
      .find(".cancelButton")
      .click();
    // When running from command line, closing the tab is too fast
    cy.get("body").then($body => {
      if ($body.find(".ms-Dialog-main").length) {
        // For some reason, this does not work
        // cy.get(".ms-Dialog-main").contains("Close").click();
        cy.get(".ms-Dialog-main .ms-Button--primary").click();
      }
    });

    // Expand folder node
    cy.get(`.treeNodeHeader[data-test="${folder}/"]`).click();
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${newNotebookName}"]`).should("exist");

    // Delete notebook
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${newNotebookName}"]`)
      .find("button.treeMenuEllipsis")
      .click();
    cy.get('[data-test="treeComponentMenuItemContainer"]')
      .contains("Delete")
      .click();

    // Confirm
    cy.get(".ms-Dialog-main")
      .contains("Delete")
      .click();
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${newNotebookName}"]`).should("not.exist");

    deleteItem(`${folder}/`);
  });

  it("Create and rename a notebook inside a directory", () => {
    const folder = "e2etest_folder4";
    const newNotebookName = "Untitled.ipynb";
    const renamedNotebookName = "mynotebook.ipynb";
    createFolder(folder);
    clickContextMenuAndSelectOption(`${folder}/`, "New Notebook");

    // Close tab
    cy.get(`.tabList[title="notebooks/${folder}/${newNotebookName}"]`)
      .find(".cancelButton")
      .click();
    cy.get("body").then($body => {
      if ($body.find(".ms-Dialog-main").length) {
        // For some reason, this does not work
        // cy.get(".ms-Dialog-main").contains("Close").click();
        cy.get(".ms-Dialog-main .ms-Button--primary").click();
      }
    });

    // Expand folder node
    cy.get(`.treeNodeHeader[data-test="${folder}/"]`).click();
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${newNotebookName}"]`).should("exist");

    // Rename notebook
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${newNotebookName}"]`)
      .find("button.treeMenuEllipsis")
      .click();
    cy.get('[data-test="treeComponentMenuItemContainer"]')
      .contains("Rename")
      .click();

    cy.get("#stringInputPane").within(() => {
      cy.get('input[name="collectionIdConfirmation"]')
        .clear()
        .type(renamedNotebookName);
      cy.get("form").submit();
    });
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${newNotebookName}"]`).should("not.exist");
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${renamedNotebookName}"]`).should("exist");

    // Delete notebook
    cy.get(`.nodeChildren[data-test="${folder}/"] .treeNodeHeader[data-test="${renamedNotebookName}"]`)
      .find("button.treeMenuEllipsis")
      .click();
    cy.get('[data-test="treeComponentMenuItemContainer"]')
      .contains("Delete")
      .click();

    // Confirm
    cy.get(".ms-Dialog-main")
      .contains("Delete")
      .click();
    // Give it time to settle
    cy.wait(1000);
    deleteItem(`${folder}/`);
  });
});