import { tabbable, isFocusable } from 'tabbable';
import { globalObject } from '@skbkontur/global-object';
import { isInstanceOf } from "../../../lib/isInstanceOf";

/**
 * Поиск всех элементов, у которых tabindex > -1, в переданном родителе
 * или на всей странице
 * @param {Element|Document|null} [parent=document] - Родительский элемент,
 * внутри которого осуществляется поиск.
 * @return {FocusableElement[]} - Массив найденных элементов
 */

export var getTabbableElements = function getTabbableElements(parent) {
  if (parent === void 0) {
    parent = globalObject.document;
  }
  if (!parent || !parent.children.length || !isInstanceOf(parent, globalObject.Element)) {
    return [];
  }
  return tabbable(parent);
};

/**
 * Поиск ближайшего фокусируемого элемента среди переданного и его родителей
 * @param {HTMLElement} current - Текущий элемент
 * @return {HTMLElement|null} - Найденный элемент или null
 *
 */

export var getClosestFocusableElement = function getClosestFocusableElement(current) {
  if (!current) {
    return null;
  }
  return isFocusable(current) ? current : getClosestFocusableElement(current.parentElement);
};