namespace Core.Utility;

public static class TextUtil
{
	/// <summary>
	/// Get the ordinal value of positive integers.
	/// </summary>
	/// <remarks>
	/// Only works for english-based cultures.
	/// Code from: http://stackoverflow.com/questions/20156/is-there-a-quick-way-to-create-ordinals-in-c/31066#31066
	/// With help: http://www.wisegeek.com/what-is-an-ordinal-number.htm
	/// </remarks>
	/// <param name="number">The number.</param>
	/// <returns>Ordinal value of positive integers, or <see cref="int.ToString"/> if less than 1.</returns>
	/// https://stackoverflow.com/a/620504/99492
	public static string Ordinal(this int number)
	{
		const string TH = "th";
		string s = number.ToString();

		// Negative and zero have no ordinal representation
		if (number < 1)
		{
			return s;
		}

		number %= 100;
		if ((number >= 11) && (number <= 13))
		{
			return s + TH;
		}

		switch (number % 10)
		{
			case 1: return s + "st";
			case 2: return s + "nd";
			case 3: return s + "rd";
			default: return s + TH;
		}
	}


	public static void ConsoleWriteTable(
		Func<int, int, bool> getVal, string rowHeader, int[] rowVars, string colHeader, int[] colVars)
	{
		var chl = $"     {colHeader} 0".Length;
		var rhl = $"{rowHeader} 0".Length + 3;
		Console.Write(new string(' ', rhl));
		foreach (var c in colVars)
		{
			Console.Write($"     {colHeader} {c + 1}");
		}
		Console.WriteLine();
		Console.WriteLine();
		foreach (var r in rowVars)
		{
			var rhead = $"{rowHeader} {r + 1}:";
			Console.Write(rhead.PadRight(rhl));
			foreach (var c in colVars)
			{
				var v = getVal(r, c) ? "1" : " ";
				Console.Write($"{v.PadLeft(chl)}");
			}

			Console.WriteLine();
		}
		Console.WriteLine();
	}
}