using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Linq;
using System.Net;
namespace FastGithub.Scanner
{
    /// 
    ///  GithubContext集合
    /// 
    [Service(ServiceLifetime.Singleton)]
    sealed class GithubContextCollection : IGithubScanResults
    {
        private readonly object syncRoot = new();
        private readonly List contextList = new();
        /// 
        /// 添加GithubContext
        /// 
        /// 
        /// 
        public bool Add(GithubContext context)
        {
            lock (this.syncRoot)
            {
                if (this.contextList.Contains(context))
                {
                    return false;
                }
                this.contextList.Add(context);
                return true;
            }
        }
        /// 
        /// 转换为数组
        /// 
        /// 
        public GithubContext[] ToArray()
        {
            lock (this.syncRoot)
            {
                return this.contextList.ToArray();
            }
        }
        /// 
        /// 查询ip是否可用
        /// 
        /// 
        /// 
        /// 
        public bool IsAvailable(string domain, IPAddress address)
        {
            lock (this.syncRoot)
            {
                var target = new GithubContext(domain, address);
                var context = this.contextList.Find(item => item.Equals(target));
                return context != null && context.Available;
            }
        }
        /// 
        /// 查找最优的ip
        /// 
        /// 
        /// 
        public IPAddress? FindBestAddress(string domain)
        {
            lock (this.syncRoot)
            {
                return this.contextList
                    .Where(item => item.Domain == domain && item.History.AvailableRate > 0d)
                    .OrderByDescending(item => item.History.AvailableRate)
                    .ThenBy(item => item.History.AvgElapsed)
                    .Select(item => item.Address)
                    .FirstOrDefault();
            }
        }
    }
}