using System.IO;
using AngleSharp.Html;
using Microsoft.AspNetCore.Http;
using System.Linq;
using AngleSharp.Html.Dom;

namespace Ksp.WebServer
{
    public class KspPageRewriter
    {
        public string RewriteHtml(string source, HttpContext context)
        {
            var p = new AngleSharp.Html.Parser.HtmlParser();
            var document = p.ParseDocument(source);

            ModifyTree(document, context.Request.Path.Value.Trim('/'));

            var outputHtml = new StringWriter();
            document.ToHtml(outputHtml, new HtmlMarkupFormatter());
            return outputHtml.ToString();
        }

        public void ModifyTree(IHtmlDocument document, string path)
        {
            foreach (var form in document.QuerySelectorAll("form"))
            {
                if (form.QuerySelector("input[type=password]") is null)
                    continue;

                var warning = document.CreateElement("div");
                warning.SetAttribute("style", "color: red; font-size: 3em; font-weight: bold");
                warning.TextContent = "Web běží na magické proxy, které byste měli věřit!!!";
                form.Prepend(warning);
            }

            var encyklopedie = document.QuerySelectorAll("#menu ul li:not(.active) a").FirstOrDefault(x => x.TextContent.Trim() == "Encyklopedie");
            if (encyklopedie is object)
            {
                encyklopedie.TextContent = "Kurzy";
                encyklopedie.SetAttribute("href", "/grafik");
                if ("grafik" == path)
                {
                    foreach (var li in document.QuerySelectorAll("#menu ul li.active"))
                        li.ClassList.Remove("active");
                    encyklopedie.ParentElement.ClassList.Add("active");
                }
            }

            var logo = document.QuerySelector("#logo > h1:nth-child(1) > a:nth-child(1)");
            if (logo is object)
            {
                logo.TextContent = "KSP Hacked Edition";
            }
        }
    }
}