import { Node } from "../../../components/TreeNode";

/**
 * Рекурсивно фильтрует дерево узлов по названию.
 *
 * @param {Node[]} nodes - Массив корневых узлов.
 * @param {string} searchTerm - Поисковый запрос.
 * @returns {Node[]} Отфильтрованное дерево.
 */
export function filterGroupNodes(nodes: Node[], searchTerm: string): Node[] {
	if (!searchTerm || !searchTerm.trim()) {
		// Если строка поиска пуста, возвращаем исходное дерево как есть
		return nodes;
	}

	const normalizedSearchTerm = searchTerm.trim().toLowerCase();

	/**
	 * Рекурсивная функция, которая проверяет узел и его потомков.
	 * Если сам узел или кто-то из его потомков содержит искомую подстроку,
	 * возвращает этот узел с отфильтрованными потомками.
	 * Иначе — возвращает null.
	 */
	function filterNode(node: Node): Node | null {
		const nameMatches = node.name
			.toLowerCase()
			.includes(normalizedSearchTerm);

		// Рекурсивно фильтруем дочерние узлы
		let filteredChildren: Node[] = [];
		if (node.children && node.children.length > 0) {
			filteredChildren = node.children
				.map(filterNode)
				.filter((childNode) => childNode !== null) as Node[];
		}

		// Если совпали имя текущего узла или остались дочерние
		// (т. е. у кого-то внутри были совпадения), включаем узел в результат
		if (nameMatches || filteredChildren.length > 0) {
			return {
				...node,
				children: filteredChildren,
			};
		}

		// Иначе — ничего не возвращаем
		return null;
	}

	// Фильтруем каждый корневой узел
	return nodes.map(filterNode).filter((node) => node !== null) as Node[];
}
