using System;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;

namespace Misc
{
    //字符串转换
    public class StringConverter
    {
        private const string blank = @"\s*";
        private const string num = @"\d+";

        public static Size ToSize(string s)
        {
            string RegexText = @"\{" + blank + "Width" + blank + "=" + blank + num + blank + "," + blank +
                "Height" + blank + "=" + blank + num + blank + @"\}";

            Regex regex = new Regex(RegexText);
            Match match = regex.Match(s);
            if (match.Success)
            {
                s = match.Value;
                regex = new Regex(num);
                MatchCollection matches = regex.Matches(s);
                string[] ss = new string[matches.Count];
                for (int i = 0; i < ss.Length; i++)
                {
                    ss[i] = matches[i].Value;
                }

                Size size = new Size(int.Parse(ss[0]), int.Parse(ss[1]));
                return size;
            }
            else
            {
                return Size.Empty;
            }
        }
        public static Rectangle ToRectangle(string s)
        {
            string RegexText = @"\{" +
                blank + "X" + blank + "=" + blank + num + blank + "," +
                blank + "Y" + blank + "=" + blank + num + blank + "," +
                blank + "Width" + blank + "=" + blank + num + blank + "," +
                blank + "Height" + blank + "=" + blank + num + blank + @"\}";

            Regex regex = new Regex(RegexText);
            Match match = regex.Match(s);
            if (match.Success)
            {
                s = match.Value;
                regex = new Regex(num);
                MatchCollection matches = regex.Matches(s);
                string[] ss = new string[matches.Count];
                for (int i = 0; i < ss.Length; i++)
                {
                    ss[i] = matches[i].Value;
                }

                Rectangle rect = new Rectangle(
                    int.Parse(ss[0]),
                    int.Parse(ss[1]),
                    int.Parse(ss[2]),
                    int.Parse(ss[3]));
                return rect;
            }
            else
            {
                return Rectangle.Empty;
            }
        }
        // 摘要:
        //     将主机名或 IP 地址解析为 IPEndPoint 实例。
        public static IPEndPoint ToIPEndPoint(string hostNameOrAddress)
        {
            if (string.IsNullOrEmpty(hostNameOrAddress))
                return null;

            string[] s = hostNameOrAddress.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
            if (s.Length == 1)
            {
                IPAddress ip;
                int port = 20006;
                try
                {
                    ip = IPAddress.Parse(s[0]);
                }
                catch
                {
                    try
                    {
                        IPAddress[] ips = System.Net.Dns.GetHostEntry(s[0]).AddressList;
                        if (ips.Length == 1)
                            ip = ips[0];
                        else
                            ip = IPAddress.Parse("127.0.0.1");
                    }
                    catch
                    {
                        return null;
                    }
                }
                return new IPEndPoint(ip, port);

            }
            else if (s.Length == 2)
            {
                IPAddress ip;
                int port;
                try
                {
                    port = int.Parse(s[1]);
                }
                catch
                {
                    return null;
                }
                try
                {
                    ip = IPAddress.Parse(s[0]);
                }
                catch
                {
                    try
                    {
                        IPAddress[] ips = System.Net.Dns.GetHostEntry(s[0]).AddressList;
                        if (ips.Length == 1)
                            ip = ips[0];
                        else
                            ip = IPAddress.Parse("127.0.0.1");
                    }
                    catch
                    {
                        return null;
                    }
                }
                return new IPEndPoint(ip, port);
            }
            return null;
        }


        // 摘要:
        //     将主机名或 IP 地址解析为 IPEndPoint 实例。
        public static IPEndPoint ToIPEndPoint(string hostNameOrAddress, IPAddress default_address, int default_port)
        {
            IPAddress ip = default_address;
            int port = default_port;

            if (string.IsNullOrEmpty(hostNameOrAddress))
            {
                return new IPEndPoint(ip, port);
            }

            string[] s = hostNameOrAddress.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
            if (s.Length == 1)
            {
                try
                {
                    ip = IPAddress.Parse(s[0]);
                }
                catch
                {
                    try
                    {
                        IPAddress[] ips = System.Net.Dns.GetHostEntry(s[0]).AddressList;
                        if (ips.Length == 1)
                            ip = ips[0];
                    }
                    catch
                    {

                    }
                }
            }
            else if (s.Length == 2)
            {
                try
                {
                    port = int.Parse(s[1]);
                }
                catch
                {

                }

                try
                {
                    ip = IPAddress.Parse(s[0]);
                }
                catch
                {
                    try
                    {
                        IPAddress[] ips = System.Net.Dns.GetHostEntry(s[0]).AddressList;
                        if (ips.Length == 1)
                            ip = ips[0];
                    }
                    catch
                    {

                    }
                }
            }


            return new IPEndPoint(ip, port);
        }


        public static string IPEndPoint2DirectoryName(IPEndPoint ipep)
        {
            return ipep.Address.ToString() + "_" + ipep.Port.ToString();
        }
    }
}
