using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;

namespace Otchinslator;

public static class Utils
{
    public static async void LogToTg(string message, IConfiguration configuration)
    {
        string url = $"https://api.telegram.org/bot{configuration["BOT_TOKEN"]}/sendMessage?chat_id={configuration["ChatId"]}&text={Uri.EscapeDataString(message)}";
        HttpClient client = new HttpClient();
        HttpResponseMessage response = await client.GetAsync(url); 
        if (response.IsSuccessStatusCode) { Console.WriteLine("Message tg sent successfully!"); }
        else
            Console.WriteLine($"Failed to send tg message: {response.StatusCode}");
    }
    
    // Получаем все закладки в документе
    // bStartWithNoEnds - словарь, который будет содержать только начало закладок,
    // чтобы потом по ним находить соответствующие им концы закладок
    // documentPart - элемент Word-документа
    // outs - конечный результат
    public static Dictionary<string, BookmarkEnd> FindBookmarks(OpenXmlElement documentPart,
        Dictionary<string, BookmarkEnd> outs = null, Dictionary<string, string> bStartWithNoEnds = null)
    {
        if (outs == null)
        {
            outs = new Dictionary<string, BookmarkEnd>();
        }

        if (bStartWithNoEnds == null)
        {
            bStartWithNoEnds = new Dictionary<string, string>();
        }

        // Проходимся по всем элементам на странице Word-документа
        foreach (var docElement in documentPart.Elements())
        {
            // BookmarkStart определяет начало закладки в рамках документа
            // маркер начала связан с маркером конца закладки
            if (docElement is BookmarkStart)
            {
                var bookmarkStart = docElement as BookmarkStart;
                // Записываем id и имя закладки
                bStartWithNoEnds.Add(bookmarkStart.Id, bookmarkStart.Name);
            }

            // BookmarkEnd определяет конец закладки в рамках документа
            if (docElement is BookmarkEnd)
            {
                var bookmarkEnd = docElement as BookmarkEnd;
                foreach (var startName in bStartWithNoEnds)
                {
                    // startName.Key как раз и содержит id закладки
                    // здесь проверяем, что есть связь между началом и концом закладки
                    if (bookmarkEnd.Id == startName.Key)
                        // В конечный массив добавляем то, что нам и нужно получить
                        outs.Add(startName.Value, bookmarkEnd);
                }
            }

            // Рекурсивно вызываем данный метод, чтобы пройтись по всем элементам
            // word-документа
            FindBookmarks(docElement, outs, bStartWithNoEnds);
        }

        return outs;
    }
}