using YG;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Net.NetworkInformation;
namespace System.Text
{
    public class Notify : System.ComponentModel.INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyProper(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
            }
        }
    }
    public static class CommonAtrr
    {
        public static void ShowDialog(this System.Windows.Forms.Form fm, string msg, bool isthread = true)
        {
            if (isthread)
            {
                Task.Factory.StartNew(() =>
                {
                    System.Windows.Forms.MessageBox.Show(msg, "信息提示", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Asterisk);
                });
            }
            else
            {
                System.Windows.Forms.MessageBox.Show(msg, "信息提示", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Asterisk);
            }
        }
        /// 
        /// 判断text里边是否为空,如果为空那么弹出提示信息
        /// 
        /// 
        /// 
        public static bool Text_Check_value_Empty(this System.Windows.Forms.TextBox text, string showmsg)
        {
            if (string.IsNullOrEmpty(text.Text))
            {
                Task.Factory.StartNew(() => { System.Windows.Forms.MessageBox.Show(showmsg, "信息提示", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Asterisk); });
                return false;
            }
            return true;
        }
        public static byte[] ReturnBtyesWtitString(this string value, int byteleng = 30)
        {
            byte[] bt = new byte[byteleng];
            byte[] item = Encoding.ASCII.GetBytes(value.ToClone());
            Array.Copy(item, bt, item.Length);
            return bt;
        }
        public static bool Ping(this string ip)
        {
            Ping ping = new Ping();
            PingReply pingReply = ping.Send(ip.ToClone());
            if (pingReply.Status.Equals(IPStatus.Success))
            {
                return true;
            }
            return false;
        }
        /// 
        /// 判断当前路径是否存在, 如果不存在就创建,
        /// 
        /// 
        /// 如果为false则表示当前路径不存在,true则表示当前路径存在
        public static bool PathIsExist(this string path)
        {
            try
            {
                if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(path.ToClone())))
                {
                    System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
                }
                if (!File.Exists(path))
                {
                    File.Create(path).Close();
                    return false;
                }
            }
            catch (Exception ex)
            {
                YG.Log.Instance.WriteLogAdd($"87-->{ex.Message}");
                return false;
            }
            return true;
        }
        /// 
        /// 判断text里边是否为空,并且文本的长度是否小于当前参数,如果小于那么弹出提示信息
        /// 
        /// 
        /// 
        /// 
        public static bool Text_Check_valueLeng_Empty(this System.Windows.Forms.TextBox text, int textleng, string showmsg)
        {
            if (string.IsNullOrEmpty(text.Text) && text.Text.Length < textleng)
            {
                Task.Factory.StartNew(() => { System.Windows.Forms.MessageBox.Show(showmsg); });
                return false;
            }
            return true;
        }
        /// 
        /// 把字符转换为int
        /// 
        /// 
        /// 
        public static int StringToInt(this string value)
        {
            try { return Convert.ToInt32(value.ToClone()); }
            catch
            {
                Log.Instance.WriteLogAdd(value + "在进行类型转换StringToInt时出现异常", null);
                return 0;
            }
        }
        /// 
        /// 把字符转换为int
        /// 
        /// 
        /// 
        public static bool StringToBool(this string value)
        {
            try { return Convert.ToBoolean(value.StringToInt()); }
            catch
            {
                Log.Instance.WriteLogAdd(value + "在进行类型转换StringToBool时出现异常", null);
                return false;
            }
        }
        /// 
        /// 拷贝
        /// 
        /// 
        /// The list.
        /// List{``0}.
        public static System.ComponentModel.BindingList Clone(this System.ComponentModel.BindingList List)
        {
            using (Stream objectStream = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(objectStream, List);
                objectStream.Seek(0, SeekOrigin.Begin);
                return formatter.Deserialize(objectStream) as System.ComponentModel.BindingList;
            }
        }
        public static List Clone(this List List)
        {
            using (Stream objectStream = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(objectStream, List);
                objectStream.Seek(0, SeekOrigin.Begin);
                return formatter.Deserialize(objectStream) as List;
            }
        }
        public static float StringToFloat(this string value)
        {
            try { return Convert.ToSingle(value.ToClone()); }
            catch
            {
                Log.Instance.WriteLogAdd(value + "在进行类型转换StringToFloat时出现异常", null);
                return 0;
            }
        }
        /// 
        /// 把字符转换为double类型 
        /// 
        /// 
        /// 
        public static double StringToDouble(this string value)
        {
            try { return Convert.ToDouble(value.ToClone()); }
            catch
            {
                Log.Instance.WriteLogAdd(value + "在进行类型转换StringToDouble时出现异常");
                return 0;
            }
        }
        /// 
        /// 把噢bject类型转换为int类型
        /// 
        /// 
        /// 
        public static int ObjectToInt(this object ob)
        {
            return ob.ToString().StringToInt();
        }
        public static string GuidLeng(this Guid guid,int leng=30)
        {
            return guid.ToString().Substring(0, leng);
        }
        public static int BoolToInt(this bool bl)
        {
            if (bl)
            {
                return 1;
            }
            return 0;
        }
        public static short ObjectToShort(this object ob)
        {
            return short.Parse(ob.ToString());
        }
        
        public static byte ObjectToByte(this object ob)
        {
            return byte.Parse(ob.ToString());
        }
        public static string DateTimeToString(this DateTime dt)
        {
            return dt.ToString("yyyy-MM-dd HH:mm:ss");
        }
        /// 
        /// 把噢bject类型转换为double类型
        /// 
        /// 
        /// 
        public static double ObjectToDouble(this object ob)
        {
            return ob.ToString().StringToDouble();
        }
        public static string ObjectToString(this object ob)
        {
            try { if (ob != null) return ob.ToString(); else Log.Instance.WriteLogAdd("转换object为string类型时出现哦bject为空的情况默认返回空字符串"); return ""; }
            catch(Exception ex) { YG.Log.Instance.WriteLogAdd($"216-->{ex.Message}"); return ""; }
        }
        public static void DataGridViewColor(this System.Windows.Forms.DataGridView dv)
        {
            dv.RowsDefaultCellStyle.BackColor = Drawing.Color.AliceBlue;
            dv.AlternatingRowsDefaultCellStyle.BackColor = Drawing.Color.Aquamarine;
        }
        /// 
        /// 判断当前的FirstOrDefaul是否为空,如果为空,那么不执行参数函数
        /// 
        /// 
        /// 
        /// 
        public static bool FirstOrDefaultYG(this TSource source, Action action)
        {
            if (source != null)
            {
                try
                {
                    action(source);
                    return true;
                }
                catch
                {
                    Log.Instance.WriteLogAdd("执行FirstOrDefaultYG函数时出现异常情况");
                    return false;
                }
            }
            return false;
        }
        public static bool Foreach(this IEnumerable source, Action action)
        {
            if (source != null)
            {
                try
                {
                    foreach (var c in source)
                    {
                        action(c);
                    }
                    return true;
                }
                catch
                {
                    Log.Instance.WriteLogAdd("执行Foreach函数时出现异常情况");
                    return false;
                }
            }
            return false;
        }
        /// 
        /// 把对象转换为字符串
        /// 
        /// 
        /// 
        public static string Json_SerializeObject(this object ob)
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(ob);
        }
        /// 
        /// 把字符串转换为对象
        /// 
        /// 
        /// 
        /// 
        public static T Json_DeserializeObject(this string value)
        {
            try
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject(value);
            }
            catch
            {
                Log.Instance.WriteLogAdd(string.Format("转换类型时出现异常{0}-->{1}", typeof(T), value));
                return default(T);
            }
        }
        /// 
        /// 如果字符串为空, 那么返回true
        /// 
        /// 
        /// 
        public static bool StringIsEmpty(this string msg)
        {
            if (string.IsNullOrEmpty(msg))
            {
                return true;
            }
            return false;
        }
        /// 
        /// 通用summary
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        private static bool ObjectWriteCVS(this T t, StreamWriter sw, bool ishead)
        {
            try
            {
                System.Reflection.PropertyInfo[] minfo = t.GetType().GetProperties();
                if (minfo.Length > 0)
                {
                    foreach (System.Reflection.PropertyInfo mi in minfo)
                    {
                        if (mi.PropertyType.IsGenericType)
                        {
                            object ob = mi.GetValue(t, null);
                            int count = (int)ob.GetType().GetProperty("Count").GetValue(ob);//.GetValue(t);
                            for (int i = 0; i < count; i++)
                            {
                                object item = ob.GetType().GetProperty("Item").GetValue(ob, new object[] { i });
                                if (item.GetType().GetProperties().Where(m => m.Name.Equals("Item_type") && m.GetValue(item).Equals("Elect")).Count() > 0)
                                {
                                    break;
                                }
                                item.ObjectWriteCVS(sw, ishead);
                            }
                        }
                        else
                        {
                            //if (mi.Name.Equals("Item_type") && mi.GetValue(t).Equals("Elect"))
                            //{
                            //    break;
                            //}
                            object[] atrti = mi.GetCustomAttributes(false);
                            if (atrti != null && atrti.Count() > 0)
                            {
                                YGAttribute YGa = mi.GetCustomAttributes(false)[0] as YGAttribute;
                                if (YGa != null && YGa.IsWrite)
                                {
                                    if (ishead)
                                    {
                                        sw.Write(mi.Name);
                                        sw.Write("\t");
                                    }
                                    else
                                    {
                                        sw.Write(mi.GetValue(t).ToString().Replace("\r", " ").Replace("\n", " ").Replace("\t", " "));
                                        sw.Write("\t");
                                    }
                                    //   sw.Write("\t");
                                }
                            }
                        }
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                YG.Log.Instance.WriteLogAdd($"377-->{ex.Message}");
                return false;
            }
        }
        /// 
        /// 把对象写入到cvs表格里便
        /// 
        /// 
        /// 
        /// 
        public static bool ObjectWriteCVS(this T t, string path)
        {
            try
            {
                System.IO.FileStream fs = new FileStream(path, System.IO.FileMode.Append, System.IO.FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs, new System.Text.UnicodeEncoding());
                System.Reflection.PropertyInfo[] minfo = t.GetType().GetProperties();
                if (minfo.Length > 0)
                {
                    foreach (System.Reflection.PropertyInfo mi in minfo)
                    {
                        if (mi.PropertyType.IsGenericType)
                        {
                            object ob = mi.GetValue(t, null);
                            int count = (int)ob.GetType().GetProperty("Count").GetValue(ob);//.GetValue(t);
                            for (int i = 0; i < count; i++)
                            {
                                object item = ob.GetType().GetProperty("Item").GetValue(ob, new object[] { i });
                                foreach (var pro in item.GetType().GetProperties())
                                {
                                    object[] atrti = pro.GetCustomAttributes(false);
                                    if (atrti != null && atrti.Count() > 0)
                                    {
                                        YGAttribute YGa = pro.GetCustomAttributes(false)[0] as YGAttribute;
                                        if (YGa != null && YGa.IsWrite)
                                        {
                                            sw.Write(pro.GetValue(item));
                                            sw.Write("\t");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                sw.WriteLine("");
                sw.Flush();
                sw.Close();
                return true;
            }
            catch (Exception ex)
            {
                YG.Log.Instance.WriteLogAdd(ex.Message);
                return false;
            }
        }
    }
    /// 
    /// 是否写入CVS
    /// 
    public class YGAttribute : Attribute
    {
        /// 
        /// 是否写入CVS
        /// 
        public bool IsWrite { get; set; } = true;
    }
}