using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class ZennoPosterRussianNumberConverter
{
    private static readonly Dictionary<string, long> NumberWords = new Dictionary<string, long>
    {
        {"ноль", 0}, {"один", 1}, {"одна", 1}, {"одно", 1}, {"два", 2}, {"две", 2},
        {"три", 3}, {"четыре", 4}, {"пять", 5}, {"шесть", 6}, {"семь", 7},
        {"восемь", 8}, {"девять", 9}, {"десять", 10}, {"одиннадцать", 11},
        {"двенадцать", 12}, {"тринадцать", 13}, {"четырнадцать", 14},
        {"пятнадцать", 15}, {"шестнадцать", 16}, {"семнадцать", 17},
        {"восемнадцать", 18}, {"девятнадцать", 19}, {"двадцать", 20},
        {"тридцать", 30}, {"сорок", 40}, {"пятьдесят", 50}, {"шестьдесят", 60},
        {"семьдесят", 70}, {"восемьдесят", 80}, {"девяносто", 90},
        {"сто", 100}, {"двести", 200}, {"триста", 300}, {"четыреста", 400},
        {"пятьсот", 500}, {"шестьсот", 600}, {"семьсот", 700}, {"восемьсот", 800},
        {"девятьсот", 900}, {"тысяча", 1000}, {"тысячи", 1000}, {"тысяч", 1000},
        {"миллион", 1000000}, {"миллиона", 1000000}, {"миллионов", 1000000},
        {"миллиард", 1000000000}, {"миллиарда", 1000000000}, {"миллиардов", 1000000000}
    };
    public static string ConvertWordsToNumbers(string text, IZennoPosterProjectModel project)
    {
        try
        {
            if (string.IsNullOrEmpty(text))
                return text;
            // Регулярное выражение для русских числовых слов
            string pattern = @"\b(ноль|один|одна|одно|два|две|три|четыре|пять|шесть|семь|восемь|девять|десять|одиннадцать|двенадцать|тринадцать|четырнадцать|пятнадцать|шестнадцать|семнадцать|восемнадцать|девятнадцать|двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто|сто|двести|триста|четыреста|пятьсот|шестьсот|семьсот|восемьсот|девятьсот|тысяча|тысячи|тысяч|миллион|миллиона|миллионов|миллиард|миллиарда|миллиардов)\b";
            string[] words = Regex.Split(text.ToLower(), pattern, RegexOptions.IgnoreCase);
            string result = text;
            string currentNumberWords = "";
            bool isProcessingNumber = false;
            string ProcessNumberWords(string numberWords)
            {
                if (string.IsNullOrEmpty(numberWords))
                    return "";
                string[] parts = numberWords.Trim().Split();
                long total = 0, current = 0;
                foreach (string word in parts)
                {
                    if (NumberWords.TryGetValue(word, out long value))
                    {
                        if (value >= 1000) // тысяча, миллион, миллиард
                        {
                            current = current == 0 ? 1 : current;
                            total += current * value;
                            current = 0;
                        }
                        else if (value >= 100) // сотни
                        {
                            current = current == 0 ? value : current + value;
                        }
                        else // числа от 0 до 90
                        {
                            current += value;
                        }
                    }
                }
                total += current;
                return total.ToString();
            }
            for (int i = 0; i < words.Length; i++)
            {
                if (Regex.IsMatch(words[i], pattern, RegexOptions.IgnoreCase))
                {
                    currentNumberWords += words[i] + " ";
                    isProcessingNumber = true;
                }
                else
                {
                    if (isProcessingNumber)
                    {
                        string numberString = ProcessNumberWords(currentNumberWords);
                        string originalNumberWords = text.Substring(result.Length - currentNumberWords.Length, currentNumberWords.Length).Trim();
                        result = result.Substring(0, result.Length - currentNumberWords.Length) + numberString;
                        currentNumberWords = "";
                        isProcessingNumber = false;
                    }
                    result = result.Substring(0, result.Length - words[i].Length) + words[i];
                }
            }
            if (isProcessingNumber)
            {
                string numberString = ProcessNumberWords(currentNumberWords);
                result = result.Substring(0, result.Length - currentNumberWords.Length) + numberString;
            }
            return result;
        }
        catch (Exception ex)
        {
            project.SendErrorToLog($"Error in ConvertWordsToNumbers: {ex.Message}", false);
            return text; // Возвращаем исходный текст в случае ошибки
        }
    }
}