'use strict';

const rangeOperators = ['>=', '<=', '>', '<', '='];
const styleSearch = require('style-search');

function getRangeContextOperators(node) {
	const operators = [];

	styleSearch({ source: node.value, target: rangeOperators }, (match) => {
		const before = node[match.startIndex - 1];

		if (before === '>' || before === '<') {
			return;
		}

		operators.push(match.target);
	});

	// Sorting helps when using the operators to split
	// E.g. for "(10em < width <= 50em)" this returns ["<=", "<"]
	return operators.sort((a, b) => b.length - a.length);
}

function getRangeContextName(parsedNode) {
	// When the node is like "(10em < width < 50em)"
	// The parsedNode is ["10em", "width", "50em"] - the name is always in the second position
	if (parsedNode.length === 3) {
		return parsedNode[1];
	}

	// When the node is like "(width > 10em)" or "(10em < width)"
	// Regex is needed because the name can either be in the first or second position
	return parsedNode.find((value) => value.match(/^(?!--)\D+/) || value.match(/^(--).+/));
}

module.exports = function (node) {
	const nodeValue = node.value;

	const operators = getRangeContextOperators(node);

	// Remove spaces and parentheses and split by the operators
	const parsedMedia = nodeValue.replace(/[()\s]/g, '').split(new RegExp(operators.join('|')));

	const name = getRangeContextName(parsedMedia);
	const nameObj = {
		value: name,
		sourceIndex: node.sourceIndex + nodeValue.indexOf(name),
	};

	const values = parsedMedia
		.filter((parsedValue) => parsedValue !== name)
		.map((value) => {
			return {
				value,
				sourceIndex: node.sourceIndex + nodeValue.indexOf(value),
			};
		});

	return {
		name: nameObj,
		values,
	};
};
