using FastGithub.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
using System.Net.Http.Json;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub.Upgrade
{
    /// 
    /// 升级服务
    /// 
    sealed class UpgradeService
    {
        private readonly IDomainResolver domainResolver;
        private readonly ILogger logger;
        private readonly Uri releasesUri = new("https://api.github.com/repos/xljiulang/fastgithub/releases");
        /// 
        /// 升级服务
        /// 
        /// 
        /// 
        public UpgradeService(
            IDomainResolver domainResolver,
            ILogger logger)
        {
            this.domainResolver = domainResolver;
            this.logger = logger;
        }
        /// 
        /// 进行升级
        /// 
        /// 
        /// 
        public async Task UpgradeAsync(CancellationToken cancellationToken)
        {
            var currentVersion = ProductionVersion.GetApplicationVersion();
            if (currentVersion == null)
            {
                return;
            }
            var lastRelease = await this.GetLastedReleaseAsync(cancellationToken);
            if (lastRelease == null)
            {
                return;
            }
            var lastedVersion = lastRelease.GetProductionVersion();
            if (lastedVersion.CompareTo(currentVersion) > 0)
            {
                this.logger.LogInformation($"当前版本{currentVersion}为老版本{Environment.NewLine}请前往{lastRelease.HtmlUrl}下载新版本");
                this.logger.LogInformation(lastRelease.ToString());
            }
            else
            {
                this.logger.LogInformation($"当前版本{currentVersion}为最新版本");
            }
        }
        /// 
        /// 获取最新发布
        /// 
        /// 
        public async Task GetLastedReleaseAsync(CancellationToken cancellationToken)
        {
            var domainConfig = new DomainConfig
            {
                TlsSni = false,
                TlsIgnoreNameMismatch = true,
                Timeout = TimeSpan.FromSeconds(30d)
            };
            using var request = new GithubRequestMessage
            {
                RequestUri = this.releasesUri
            };
            using var httpClient = new HttpClient(domainConfig, this.domainResolver);
            var response = await httpClient.SendAsync(request, cancellationToken);
            var releases = await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken);
            return releases?.FirstOrDefault(item => item.Prerelease == false);
        }
    }
}