//  Clear selection range of current selected term view
//  Fix event when terminal text is selected and keyboard action is invoked
exports.clear = function (terminal) {
  terminal.document_.getSelection().removeAllRanges();
};

// Use selection extend upon dblclick
exports.extend = function (terminal) {
  const sel = terminal.document_.getSelection();

  // Test if focusNode exist and nodeName is #text
  if (sel.focusNode && sel.focusNode.nodeName === '#text') {
    terminal.screen_.expandSelection(sel);
    if (terminal.copyOnSelect) {
      terminal.copyStringToClipboard(sel);
    }
  }
};

// Fix a bug in ScrollPort selectAll behavior
// Select all rows in the viewport
exports.all = function (terminal) {
  const scrollPort = terminal.scrollPort_;
  let firstRow;
  let lastRow;

  if (scrollPort.topFold_.nextSibling.rowIndex === 0) {
    firstRow = scrollPort.topFold_.nextSibling;
  } else {
    while (scrollPort.topFold_.previousSibling) {
      scrollPort.rowNodes_.removeChild(scrollPort.topFold_.previousSibling);
    }

    firstRow = scrollPort.fetchRowNode_(0);
    scrollPort.rowNodes_.insertBefore(firstRow, scrollPort.topFold_);
    scrollPort.syncRowNodesDimensions_();
  }

  const lastRowIndex = scrollPort.rowProvider_.getRowCount() - 1;

  if (scrollPort.bottomFold_.previousSibling.rowIndex === lastRowIndex) {
    lastRow = scrollPort.bottomFold_.previousSibling.rowIndex;
  } else {
    while (scrollPort.bottomFold_.nextSibling) {
      scrollPort.rowNodes_.removeChild(scrollPort.bottomFold_.nextSibling);
    }

    lastRow = scrollPort.fetchRowNode_(lastRowIndex);
    scrollPort.rowNodes_.appendChild(lastRow);
  }

  scrollPort.selection.sync();
};
