public async Task <IActionResult> OnPostGenerateCatPageAsync(GanjoorTOC GanjoorTOC)
        {
            if (!(await PreparePage()))
            {
                return(Page());
            }

            var response = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/cat?url={PageInformation.FullUrl}&poems=true");

            if (!response.IsSuccessStatusCode)
            {
                LastMessage = JsonConvert.DeserializeObject <string>(await response.Content.ReadAsStringAsync());
                return(Page());
            }


            var Cat = JsonConvert.DeserializeObject <GanjoorPoetCompleteViewModel>(await response.Content.ReadAsStringAsync());

            using (HttpClient secureClient = new HttpClient())
            {
                if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
                {
                    var htmlRes = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/cat/toc/{Cat.Cat.Id}/{(int)GanjoorTOC}");

                    if (!htmlRes.IsSuccessStatusCode)
                    {
                        LastMessage = JsonConvert.DeserializeObject <string>(await htmlRes.Content.ReadAsStringAsync());
                        return(Page());
                    }

                    ModifyModel.HtmlText = await htmlRes.Content.ReadAsStringAsync();

                    LastMessage = $"متن تولیدی دریافت شد. لطفا آن را کپی کنید و سپس <a href=\"/Admin/ModifyPage?id={Request.Query["id"]}\">اینجا</a> کلیک کنید و آن را درج نمایید.";
                }
                else
                {
                    LastMessage = "لطفا از گنجور خارج و مجددا به آن وارد شوید.";
                }
            }
            return(Page());
        }
        private async Task <RServiceResult <string> > _GenerateTableOfContents(RMuseumDbContext context, int catId, GanjoorTOC options)
        {
            string html    = "";
            var    subCats = await context.GanjoorCategories.Where(c => c.ParentId == catId).OrderBy(c => c.Id).AsNoTracking().ToArrayAsync();

            foreach (var cat in subCats)
            {
                html += $"<p><a href=\"{cat.FullUrl}\">{cat.Title}</a></p>{Environment.NewLine}";
            }

            var poems = await context.GanjoorPoems.Where(p => p.CatId == catId).OrderBy(p => p.Id).AsNoTracking().ToArrayAsync();

            if (poems.Length > 0)
            {
                if (options == GanjoorTOC.Analyse)
                {
                    if (poems.Where(p => !string.IsNullOrEmpty(p.RhymeLetters)).Count() * 100 / poems.Length > 50)
                    {
                        options = GanjoorTOC.AlphabeticWithFirstVerse;
                    }
                    else
                    {
                        options = GanjoorTOC.TitlesAndFirstVerse;
                    }
                }
            }

            if
            (
                options == GanjoorTOC.AlphabeticWithFirstCouplet
                ||
                options == GanjoorTOC.AlphabeticWithFirstVerse
                ||
                options == GanjoorTOC.AlphabeticWithSecondVerse
            )
            {
                var taggedPoems = poems.Where(p => !string.IsNullOrEmpty(p.RhymeLetters)).ToArray();
                if (taggedPoems.Length > 0)
                {
                    html += $"<p>فهرست شعرها به ترتیب آخر حرف قافیه گردآوری شده است. برای پیدا کردن یک شعر کافی است حرف آخر قافیهٔ آن را در نظر بگیرید تا بتوانید آن  را پیدا کنید.</p>{Environment.NewLine}";
                    var randomPoem       = taggedPoems[new Random(DateTime.Now.Millisecond).Next(taggedPoems.Length)];
                    var randomPoemVerses = await context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == randomPoem.Id).OrderBy(v => v.VOrder).ToArrayAsync();

                    if (randomPoemVerses.Length > 2)
                    {
                        html += $"<p>مثلاً برای پیدا کردن شعری که مصرع <em>{randomPoemVerses[1].Text}</em> مصرع دوم یکی از بیتهای آن است باید شعرهایی را نگاه کنید که آخر حرف قافیهٔ آنها «<em><a href=\"#{ GPersianTextSync.UniquelyFarglisize(randomPoem.RhymeLetters.Substring(randomPoem.RhymeLetters.Length - 1)) }\">{randomPoem.RhymeLetters.Substring(randomPoem.RhymeLetters.Length - 1)}</a></em>» است.</p>{Environment.NewLine}";
                    }

                    html += $"<h3><a id=\"index\">دسترسی سریع به حروف</a></h3>{Environment.NewLine}";
                    html += $"<p>{Environment.NewLine}";
                    string        lastChar         = "";
                    List <string> visitedLastChart = new List <string>();
                    foreach (var poem in taggedPoems)
                    {
                        string poemLastChar = poem.RhymeLetters.Substring(poem.RhymeLetters.Length - 1);
                        if (poemLastChar != lastChar)
                        {
                            if (visitedLastChart.IndexOf(poemLastChar) == -1)
                            {
                                if (lastChar != "")
                                {
                                    html += " | ";
                                }
                                html    += $"<a href=\"#{GPersianTextSync.UniquelyFarglisize(poemLastChar)}\">{poemLastChar}</a>";
                                lastChar = poemLastChar;

                                visitedLastChart.Add(poemLastChar);
                            }
                        }
                    }
                    html += $"</p>{Environment.NewLine}";
                }
            }

            string        last        = "";
            List <string> visitedLast = new List <string>();

            foreach (var poem in poems)
            {
                if
                (
                    options == GanjoorTOC.AlphabeticWithFirstCouplet
                    ||
                    options == GanjoorTOC.AlphabeticWithFirstVerse
                    ||
                    options == GanjoorTOC.AlphabeticWithSecondVerse
                )
                {
                    if (!string.IsNullOrEmpty(poem.RhymeLetters))
                    {
                        string poemLast = poem.RhymeLetters.Substring(poem.RhymeLetters.Length - 1);
                        if (poemLast != last)
                        {
                            if (visitedLast.IndexOf(poemLast) == -1)
                            {
                                html += $"<h3><a href=\"#index\" id=\"{GPersianTextSync.UniquelyFarglisize(poemLast)}\">{poemLast}</a></h3>{Environment.NewLine}";
                                last  = poemLast;
                                visitedLast.Add(poemLast);
                            }
                        }
                    }
                }

                html += $"<p><a href=\"{poem.FullUrl}\">{poem.Title}</a>";

                var verses = await context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == poem.Id).OrderBy(v => v.VOrder).ToArrayAsync();

                if (verses.Length > 0)
                {
                    if (options == GanjoorTOC.TitlesAndFirstVerse || options == GanjoorTOC.AlphabeticWithFirstVerse)
                    {
                        html += $": {verses[0].Text}";
                    }
                    else
                    if (options == GanjoorTOC.AlphabeticWithSecondVerse || options == GanjoorTOC.TitlesAndSecondVerse)
                    {
                        if (verses.Length > 1)
                        {
                            html += $": {verses[1].Text}";
                        }
                        else
                        {
                            html += $": {verses[0].Text}";
                        }
                    }
                    else
                    if (options == GanjoorTOC.AlphabeticWithFirstCouplet || options == GanjoorTOC.TitlesAndFirstCouplet)
                    {
                        if (verses.Length > 1)
                        {
                            html += $": {verses[0].Text} - {verses[1].Text}";
                        }
                        else
                        {
                            html += $": {verses[0].Text}";
                        }
                    }
                    else
                    if (options == GanjoorTOC.TitlesAndFirstCenteredVerse)
                    {
                        if (verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).Any())
                        {
                            html += $": {verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).First().Text}";
                        }
                        else
                        {
                            html += $": {verses[0].Text}";
                        }
                    }
                    else
                    if (options == GanjoorTOC.TitlesAndFirstCenteredCouplet)
                    {
                        if (
                            verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).Any()
                            &&
                            verses.Where(v => v.VersePosition == VersePosition.CenteredVerse2).Any()
                            )
                        {
                            html += $": {verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).First().Text} - {verses.Where(v => v.VersePosition == VersePosition.CenteredVerse2).First().Text}";
                        }
                        else
                        {
                            html += $": {verses[0].Text}";
                        }
                    }
                }


                html += $"</p>{Environment.NewLine}";
            }
            return(new RServiceResult <string>(html));
        }
 /// <summary>
 /// generate category TOC
 /// </summary>
 /// <param name="catId"></param>
 /// <param name="options"></param>
 /// <returns></returns>
 public async Task <RServiceResult <string> > GenerateTableOfContents(int catId, GanjoorTOC options)
 {
     return(await _GenerateTableOfContents(_context, catId, options));
 }