/**
 * Flattens all child items in selected folder(s), moving every item into the selected folder.
 *
 * If nothing is selected, flattens every item into the project root.
 *
 * @author Zack Lovatt <zack@lova.tt>
 * @version 0.1.0
 */
(function flattenFolder() {
  var selection = app.project.selection;

  // If nothing's selected, flatten the whole project
  if (selection.length == 0) {
    selection = [app.project.rootFolder];
  }

  try {
    app.beginUndoGroup("Create Layer Backdrop");

    _assertNoNestedSelections(selection);

    for (var ii = 0, il = selection.length; ii < il; ii++) {
      var selectedItem = selection[ii];

      if (!(selectedItem instanceof FolderItem)) {
        continue;
      }

      _flattenFolder(selectedItem, selectedItem);
    }
  } catch (e) {
    alert(e, "Flatten Folder");
  } finally {
    app.endUndoGroup();
  }

  /**
   * Checks whether any selected items are a parent of another selected item
   *
   * This is useful for ensuring valid selections, so we don't double-unnest something.
   *
   * @param {Item[]} items
   */
  function _assertNoNestedSelections(items) {
    var itemFlattenMap = {};

    for (var ii = 0, il = items.length; ii < il; ii++) {
      var item = items[ii];

      if (!(item instanceof FolderItem)) {
        continue;
      }

      var tempItem = item;

      while (tempItem.parentFolder !== null) {
        var itemID = tempItem.id;

        if (itemFlattenMap.hasOwnProperty(itemID.toString()) && itemFlattenMap[itemID] == true) {
          throw new Error("Can't flatten selection, as some items contain each other!");
        }

        itemFlattenMap[itemID] = false;
        tempItem = tempItem.parentFolder;
      }

      itemFlattenMap[item.id] = true;
    }
  }

  /**
   * Recursively flatten all items in a given folder
   *
   * @param {FolderItem} folder     Current folder to look at
   * @param {FolderItem} rootFolder Root folder to move items to
   */
  function _flattenFolder(folder, rootFolder) {
    var folderItems = folder.items;

    for (var ii = folderItems.length; ii > 0; ii--) {
      var item = folderItems[ii];

      if (item instanceof FolderItem) {
        _flattenFolder(item, rootFolder);

        if (item.numItems == 0) {
          item.remove();
        }
      } else {
        item.parentFolder = rootFolder;
      }
    }
  }
})();