/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/**
 *  Test deleting bookmarks from within tags.
 */

registerCleanupFunction(async function () {
  await PlacesUtils.bookmarks.eraseEverything();
  await PlacesUtils.history.clear();
});

add_task(async function test_tags() {
  const uris = [
    Services.io.newURI("https://example.com/1"),
    Services.io.newURI("https://example.com/2"),
    Services.io.newURI("https://example.com/3"),
  ];

  let children = uris.map((uri, index) => {
    return {
      title: `bm${index}`,
      url: uri,
    };
  });

  // Note: we insert the uris in reverse order, so that we end up with the
  // display in "logical" order of bm0 at the top, and bm2 at the bottom.
  children = children.reverse();

  await PlacesUtils.bookmarks.insertTree({
    guid: PlacesUtils.bookmarks.unfiledGuid,
    children,
  });

  for (let uri of uris) {
    PlacesUtils.tagging.tagURI(uri, ["test"]);
  }

  let library = await promiseLibrary();

  // Select and open the left pane "Bookmarks Toolbar" folder.
  let PO = library.PlacesOrganizer;

  PO.selectLeftPaneBuiltIn("Tags");
  let tagsNode = PO._places.selectedNode;
  Assert.notEqual(tagsNode, null, "Should have a valid selection");
  let tagsTitle = PlacesUtils.getString("TagsFolderTitle");
  Assert.equal(tagsNode.title, tagsTitle, "Should have selected the Tags node");

  // Now select the tag.
  PlacesUtils.asContainer(tagsNode).containerOpen = true;
  let tag = tagsNode.getChild(0);
  PO._places.selectNode(tag);
  Assert.equal(
    PO._places.selectedNode.title,
    "test",
    "Should have selected the created tag"
  );

  let ContentTree = library.ContentTree;

  for (let i = 0; i < uris.length; i++) {
    ContentTree.view.selectNode(ContentTree.view.result.root.getChild(0));

    Assert.equal(
      ContentTree.view.selectedNode.title,
      `bm${i}`,
      `Should have selected bm${i}`
    );

    let promiseNotification = PlacesTestUtils.waitForNotification(
      "bookmark-tags-changed"
    );

    ContentTree.view.controller.doCommand("cmd_delete");

    await promiseNotification;

    for (let j = 0; j < uris.length; j++) {
      let tags = PlacesUtils.tagging.getTagsForURI(uris[j]);
      if (j <= i) {
        Assert.equal(
          tags.length,
          0,
          `There should be no tags for the URI: ${uris[j].spec}`
        );
      } else {
        Assert.equal(
          tags.length,
          1,
          `There should be one tag for the URI: ${uris[j].spec}`
        );
      }
    }
  }

  // The tag should now not exist.
  Assert.equal(
    await PlacesUtils.bookmarks.fetch({ tags: ["test"] }),
    null,
    "There should be no URIs remaining for the tag"
  );

  tagsNode.containerOpen = false;

  library.close();
});
