namespace DTLib;

//
// вывод и ввод цветного текста в консоли
// работает медленнее чем хотелось бы
//
public static class ColoredConsole
{
    // парсит название цвета в ConsoleColor
    public static ConsoleColor ParseColor(string color) => color switch
    {
        //case "magneta":
        "m" => ConsoleColor.Magenta,
        //case "green":
        "g" => ConsoleColor.Green,
        //case "red":
        "r" => ConsoleColor.Red,
        //case "yellow":
        "y" => ConsoleColor.Yellow,
        //case "white":
        "w" => ConsoleColor.White,
        //case "blue":
        "b" => ConsoleColor.Blue,
        //case "cyan":
        "c" => ConsoleColor.Cyan,
        //case "h":
        "h" or "gray" => ConsoleColor.Gray,
        //case "black":
        "black" => ConsoleColor.Black,
        _ => throw new Exception($"ColoredConsole.ParseColor({color}) error: incorrect color"),
    };

    // вывод цветного текста
    public static void Write(params string[] input)
    {
        if (input.Length == 1)
        {
            if (Console.ForegroundColor != ConsoleColor.Gray)
                Console.ForegroundColor = ConsoleColor.Gray;
            Console.Write(input[0]);
        }
        else if (input.Length % 2 == 0)
        {
            StringBuilder strB = new();
            for (ushort i = 0; i < input.Length; i++)
            {
                ConsoleColor c = ParseColor(input[i]);
                if (Console.ForegroundColor != c)
                {
                    Console.Write(strB.ToString());
                    Console.ForegroundColor = c;
                    strB.Clear();
                }
                strB.Append(input[++i]);
            }
            if (strB.Length > 0)
                Console.Write(strB.ToString());
        }
        else throw new Exception("ColoredConsole.Write() error: every text string must have color string before");
    }

    // ввод цветного текста
    public static string Read(string color)
    {
        ConsoleColor c = ParseColor(color);
        if (Console.ForegroundColor != c)
            Console.ForegroundColor = c;
        return Console.ReadLine();
    }
}
