using System.Net.Http;
using System.Text.RegularExpressions;
using Wabbajack.Common;
using Wabbajack.Lib.Validation;

namespace Wabbajack.Lib.Downloaders
{
    public class ModDBDownloader : IDownloader, IUrlDownloader
    {
        public AbstractDownloadState GetDownloaderState(dynamic archiveINI)
        {
            var url = archiveINI?.General?.directURL;
            return GetDownloaderState(url);
        }

        public AbstractDownloadState GetDownloaderState(string url)
        {
            if (url != null && url.StartsWith("https://www.moddb.com/downloads/start"))
            {
                return new State
                {
                    Url = url
                };
            }

            return null;
        }

        public void Prepare()
        {
        }

        public class State : AbstractDownloadState
        {
            public string Url { get; set; }
            public override bool IsWhitelisted(ServerWhitelist whitelist)
            {
                // Everything from Moddb is whitelisted
                return true;
            }

            public override void Download(Archive a, string destination)
            {
                var newURL = GetDownloadUrl();
                new HTTPDownloader.State {Url = newURL}.Download(a, destination);
            }

            private string GetDownloadUrl()
            {
                var client = new HttpClient();
                var result = client.GetStringSync(Url);
                var regex = new Regex("https:\\/\\/www\\.moddb\\.com\\/downloads\\/mirror\\/.*(?=\\\")");
                var match = regex.Match(result);
                var newURL = match.Value;
                return newURL;
            }

            public override bool Verify()
            {
                var newURL = GetDownloadUrl();
                return new HTTPDownloader.State { Url = newURL }.Verify();
            }

            public override IDownloader GetDownloader()
            {
                return DownloadDispatcher.GetInstance<ModDBDownloader>();
            }

            public override string GetReportEntry(Archive a)
            {
                return $"* ModDB - [{a.Name}]({Url})";
            }
        }
    }
}
