using DNS.Client.RequestResolver;
using DNS.Protocol;
using DNS.Protocol.ResourceRecords;
using FastGithub.Scanner;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub.Dns
{
    /// 
    /// github相关域名解析器
    /// 
    [Service(ServiceLifetime.Singleton)]
    sealed class GithubRequestResolver : IRequestResolver
    {
        private readonly IGithubScanResults githubScanResults;
        private readonly IOptionsMonitor options;
        private readonly ILogger logger;
        /// 
        /// github相关域名解析器
        /// 
        /// 
        /// 
        /// 
        public GithubRequestResolver(
            IGithubScanResults githubScanResults,
            IOptionsMonitor options,
            ILogger logger)
        {
            this.githubScanResults = githubScanResults;
            this.options = options;
            this.logger = logger;
        }
        /// 
        /// 解析域名
        /// 
        /// 
        /// 
        /// 
        public Task Resolve(IRequest request, CancellationToken cancellationToken = default)
        {
            var response = Response.FromRequest(request);
            var question = request.Questions.FirstOrDefault();
            if (question != null && question.Type == RecordType.A)
            {
                var domain = question.Name.ToString();
                var address = this.githubScanResults.FindBestAddress(domain);
                if (address != null)
                {
                    var ttl = this.options.CurrentValue.GithubTTL;
                    var record = new IPAddressResourceRecord(question.Name, address, ttl);
                    response.AnswerRecords.Add(record);
                    this.logger.LogInformation(record.ToString());
                }
            }
            return Task.FromResult(response);
        }
    }
}