using System;
using System.Text.RegularExpressions;
namespace FastGithub
{
    /// 
    /// 表示域名表达式
    /// *表示除.之外任意0到多个字符
    /// 
    sealed class DomainPattern : IComparable
    {
        private readonly Regex regex;
        private readonly string domainPattern;
        /// 
        /// 域名表达式
        /// *表示除.之外任意0到多个字符
        /// 
        /// 域名表达式
        public DomainPattern(string domainPattern)
        {
            this.domainPattern = domainPattern;
            var regexPattern = Regex.Escape(domainPattern).Replace(@"\*", @"[^\.]*");
            this.regex = new Regex($"^{regexPattern}$", RegexOptions.IgnoreCase);
        }
        /// 
        /// 与目标比较
        /// 
        /// 
        /// 
        public int CompareTo(DomainPattern? other)
        {
            if (other is null)
            {
                return 1;
            }
            var segmentsX = this.domainPattern.Split('.');
            var segmentsY = other.domainPattern.Split('.');
            var value = segmentsX.Length - segmentsY.Length;
            if (value != 0)
            {
                return value;
            }
            for (var i = segmentsX.Length - 1; i >= 0; i--)
            {
                var x = segmentsX[i];
                var y = segmentsY[i];
                value = Compare(x, y);
                if (value == 0)
                {
                    continue;
                }
                return value;
            }
            return 0;
        }
        /// 
        ///  比较两个分段
        /// 
        /// abc
        /// abc*
        /// 
        private static int Compare(string x, string y)
        {
            var valueX = x.Replace('*', char.MaxValue);
            var valueY = y.Replace('*', char.MaxValue);
            return valueX.CompareTo(valueY);
        }
        /// 
        /// 是否与指定域名匹配
        /// 
        /// 
        /// 
        public bool IsMatch(string domain)
        {
            return this.regex.IsMatch(domain);
        }
        /// 
        /// 转换为文本
        /// 
        /// 
        public override string ToString()
        {
            return this.domainPattern;
        }
    }
}