
import { compareArray } from "@neutrium/utilities";
import { UnitTokenManager } from "../UnitTokenManager.js";

// Coalesces an array of units e.g. converts ['s','m','s'] into ['s2','m']
export function simplifyUnits(units: string[]): string[]
{
	let unitCounts = units.reduce(reduceUnit, []);

	return unitCounts.map(function (unitCount) {
		return unitCount[0] + (unitCount[1] > 1 ? unitCount[1] : "");
	});
}

function reduceUnit(acc, unit)
{
	let unitCounter = acc[unit];

	if (!unitCounter)
	{
		acc.push(unitCounter = acc[unit] = [unit, 0]);
	}

	unitCounter[1]++;

	return acc;
}

//
// Returns a string representing a normalized unit array
//
// @param {string[]} units Normalized unit array
// @returns {string} String representing passed normalized unit array and suitable for output
//
export function stringifyUnits(units: string[]): string
{
	let stringified : string;

	let isUnity = compareArray(units, ["<1>"]);

	if (isUnity)
	{
		stringified = "1";
	}
	else
	{
		stringified = simplifyUnits(getOutputNames(units)).join("*");
	}

	return stringified;
}

export function getOutputNames(units: string[]): string[]
{
	const tokenMapper = UnitTokenManager.instance;

	let unitNames = [], token, tokenNext;

	for (let i = 0, len = units.length; i < len; i++)
	{
		token = units[i];
		tokenNext = units[i + 1];

		const unit = tokenMapper.getUnit(token)

		let val = tokenMapper.getTokenDefaultValue(token)

		if (unit.category === 'prefix')
		{
			val += tokenMapper.getTokenDefaultValue(tokenNext)
			i++;
		}

		unitNames.push(val);
	}
	return unitNames;
}