import { tokenList } from '../../core/utils';

function tdHeadersAttrEvaluate(node) {
	const cells = [];
	const reviewCells = [];
	const badCells = [];

	for (let rowIndex = 0; rowIndex < node.rows.length; rowIndex++) {
		const row = node.rows[rowIndex];

		for (let cellIndex = 0; cellIndex < row.cells.length; cellIndex++) {
			cells.push(row.cells[cellIndex]);
		}
	}

	const ids = cells.reduce((ids, cell) => {
		if (cell.getAttribute('id')) {
			ids.push(cell.getAttribute('id'));
		}
		return ids;
	}, []);

	cells.forEach(cell => {
		let isSelf = false;
		let notOfTable = false;

		if (!cell.hasAttribute('headers')) {
			return;
		}

		const headersAttr = cell.getAttribute('headers').trim();
		if (!headersAttr) {
			return reviewCells.push(cell);
		}

		// Get a list all the values of the headers attribute
		const headers = tokenList(headersAttr);

		if (headers.length !== 0) {
			// Check if the cell's id is in this list
			if (cell.getAttribute('id')) {
				isSelf = headers.indexOf(cell.getAttribute('id').trim()) !== -1;
			}

			// Check if the headers are of cells inside the table
			notOfTable = headers.some(header => !ids.includes(header));

			if (isSelf || notOfTable) {
				badCells.push(cell);
			}
		}
	});

	if (badCells.length > 0) {
		this.relatedNodes(badCells);
		return false;
	}

	if (reviewCells.length) {
		this.relatedNodes(reviewCells);
		return undefined;
	}

	return true;
}

export default tdHeadersAttrEvaluate;
