using System;
using System.Text.RegularExpressions;
namespace LogLibrary.Log
{
    public unsafe class Log 
    {
        private string m_Name;
        private const string m_MessageTemplate = "{0}-{1}: {2}";
        private const string m_Debug = "DEBUG";
        private const string m_Error = "ERROR";
        private const string m_Fatal = "FATAL";
        private const string m_Info = "INFO";
        private const string m_Warn = "WARN";
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The name.
        public Log(string name)
        {
            m_Name = name;
        }
        public Log()
        {
            m_Name = "NaN";
        }
        /// 
        /// Gets a value indicating whether this instance is debug enabled.
        /// 
        /// 
        ///     true if this instance is debug enabled; otherwise, false.
        /// 
        public bool IsDebugEnabled
        {
            get { return true; }
        }
        /// 
        /// Gets a value indicating whether this instance is error enabled.
        /// 
        /// 
        ///     true if this instance is error enabled; otherwise, false.
        /// 
        public bool IsErrorEnabled
        {
            get { return true; }
        }
        /// 
        /// Gets a value indicating whether this instance is fatal enabled.
        /// 
        /// 
        ///     true if this instance is fatal enabled; otherwise, false.
        /// 
        public bool IsFatalEnabled
        {
            get { return true; }
        }
        /// 
        /// Gets a value indicating whether this instance is info enabled.
        /// 
        /// 
        ///     true if this instance is info enabled; otherwise, false.
        /// 
        public bool IsInfoEnabled
        {
            get { return true; }
        }
        /// 
        /// Gets a value indicating whether this instance is warn enabled.
        /// 
        /// 
        ///     true if this instance is warn enabled; otherwise, false.
        /// 
        public bool IsWarnEnabled
        {
            get { return true; }
        }
        public string GetDataTimeLog(string log)
        {
            return string.Format("[{0}] >>  {1}", DateTime.Now.ToString("yy-MM-dd HH:mm:ss"), log);
        }
        /// 
        /// Logs the debug message.
        /// 
        /// 
        /// The message.
        public void Debug(bool isWriteFile, object message)
        {
            string log = GetDataTimeLog(message.ToString());
            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Debug, log);
            }
        }
        /// 
        /// Logs the debug message.
        /// 
        /// 
        /// The message.
        /// The exception.
        public void Debug(bool isWriteFile, object message, Exception exception)
        {
            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Debug, log);
            }
        }
        /// 
        /// Logs the debug message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        public void DebugFormat(bool isWriteFile, string format, object arg0)
        {
            string log = GetDataTimeLog(string.Format(format, arg0));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Debug, log);
            }
        }
        /// 
        /// Logs the debug message.
        /// 
        /// 
        /// The format.
        /// The args.
        public void DebugFormat(bool isWriteFile, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(format, args));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, string.Format(format, args));
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Debug, log);
            }
        }
        /// 
        /// Logs the debug message.
        /// 
        /// 
        /// The provider.
        /// The format.
        /// The args.
        public void DebugFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(format, args));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, string.Format(provider, format, args));
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Debug, log);
            }
        }
        /// 
        /// Logs the debug message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        public void DebugFormat(bool isWriteFile, string format, object arg0, object arg1)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Debug, log);
            }
        }
        /// 
        /// Logs the debug message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        /// The arg2.
        public void DebugFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg1, arg2));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Debug, log);
            }
        }
        /// 
        /// Logs the error message.
        /// 
        /// 
        /// The message.
        public void Error(bool isWriteFile, object message)
        {
            string log = GetDataTimeLog(message.ToString());
            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Error, log);
            }
        }
        /// 
        /// Logs the error message.
        /// 
        /// 
        /// The message.
        /// The exception.
        public void Error(bool isWriteFile, object message, Exception exception)
        {
            //string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message );
            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Error, log);
            }
        }
        /// 
        /// Logs the error message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        public void ErrorFormat(bool isWriteFile, string format, object arg0)
        {
            string log = GetDataTimeLog(string.Format(format, arg0));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Error, log);
            }
        }
        /// 
        /// Logs the error message.
        /// 
        /// 
        /// The format.
        /// The args.
        public void ErrorFormat(bool isWriteFile, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(format, args));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Error, log);
            }
        }
        /// 
        /// Logs the error message.
        /// 
        /// 
        /// The provider.
        /// The format.
        /// The args.
        public void ErrorFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(provider, format, args));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Error, log);
            }
        }
        /// 
        /// Logs the error message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        public void ErrorFormat(bool isWriteFile, string format, object arg0, object arg1)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Error, log);
            }
        }
        /// 
        /// Logs the error message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        /// The arg2.
        public void ErrorFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg2));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Error, log);
            }
        }
        /// 
        /// Logs the fatal error message.
        /// 
        /// 
        /// The message.
        public void Fatal(bool isWriteFile, object message)
        {
            string log = GetDataTimeLog(message.ToString());
            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
            }
        }
        /// 
        /// Logs the fatal error message.
        /// 
        /// 
        /// The message.
        /// The exception.
        public void Fatal(bool isWriteFile, object message, Exception exception)
        {
            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
            }
        }
        /// 
        /// Logs the fatal error message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        public void FatalFormat(bool isWriteFile, string format, object arg0)
        {
            string log = GetDataTimeLog(string.Format(format, arg0));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
            }
        }
        /// 
        /// Logs the fatal error message.
        /// 
        /// 
        /// The format.
        /// The args.
        public void FatalFormat(bool isWriteFile, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(format, args));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
            }
        }
        /// 
        /// Logs the fatal error message.
        /// 
        /// 
        /// The provider.
        /// The format.
        /// The args.
        public void FatalFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(provider, format, args));
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
            }
        }
        /// 
        /// Logs the fatal error message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        public void FatalFormat(bool isWriteFile, string format, object arg0, object arg1)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
            }
        }
        /// 
        /// Logs the fatal error message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        /// The arg2.
        public void FatalFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg1, arg2));
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
            }
        }
        /// 
        /// Logs the info message.
        /// 
        /// 
        /// The message.
        public void Info(bool isWriteFile, object message)
        {
            string log = GetDataTimeLog(message.ToString());
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Info, log);
            }
        }
        /// 
        /// Logs the info message.
        /// 
        /// 
        /// The message.
        /// The exception.
        public void Info(bool isWriteFile, object message, Exception exception)
        {
            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Info, log);
            }
        }
        /// 
        /// Logs the info message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        public void InfoFormat(bool isWriteFile, string format, object arg0)
        {
            string log = GetDataTimeLog(string.Format("\n{0}\n{1}\n-----------------------------------------------------------\n\n", format, arg0));
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Info, log);
            }
        }
        /// 
        /// Logs the info message.
        /// 
        /// 
        /// The format.
        /// The args.
        //public void InfoFormat(bool isWriteFile, string format, params object[] args)
        //{
        //    string log = GetDataTimeLog(string.Format(format, args));
        //    Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
        //    if (isWriteFile)
        //    {
        //        LogUtil.WriteLogFile(m_Name, m_Info, log);
        //    }
        //}
        /// 
        /// Logs the info message.
        /// 
        /// 
        /// The provider.
        /// The format.
        /// The args.
        //public void InfoFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
        //{
        //    string log = GetDataTimeLog(string.Format(provider, format, args));
        //    Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
        //    if (isWriteFile)
        //    {
        //        LogUtil.WriteLogFile(m_Name, m_Info, log);
        //    }
        //}
        /// 
        /// Logs the info message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        //public void InfoFormat(bool isWriteFile, string format, object arg0, object arg1)
        //{
        //    string log = GetDataTimeLog(string.Format(format, arg0, arg1));
        //    Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
        //    if (isWriteFile)
        //    {
        //        LogUtil.WriteLogFile(m_Name, m_Info, log);
        //    }
        //}
        /// 
        /// Logs the info message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        /// The arg2.
        public void InfoFormat(bool isWriteFile, object arg0, object arg1, object arg2)
        {
            string func(string str, int len)
            {
                var strSLen = Regex.Replace(str, @"[^\x00-\xff]", "aa").Length;
                var strLen = str.Length;
                return str.PadLeft(len - strSLen + strLen);
            }
            string log = GetDataTimeLog(string.Format("[{0}]\t[{1}]\t{2}", arg0?.ToString(), arg1?.ToString(), arg2));
            //string log = GetDataTimeLog(string.Format("[{0}]  [{1}]  {2}", func(arg0?.ToString(), 13), func(arg1?.ToString(), 16), arg2));
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Info, log);
            }
        }
        /// 
        /// Logs the warning message.
        /// 
        /// 
        /// The message.
        public void Warn(bool isWriteFile, object message)
        {
            string log = GetDataTimeLog(message.ToString());
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Warn, log);
            }
        }
        /// 
        /// Logs the warning message.
        /// 
        /// 
        /// The message.
        /// The exception.
        public void Warn(bool isWriteFile, object message, Exception exception)
        {
            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Warn, log);
            }
        }
        /// 
        /// Logs the warning message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        public void WarnFormat(bool isWriteFile, string format, object arg0)
        {
            string log = GetDataTimeLog(string.Format(format, arg0));
            //Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Warn, log);
            }
        }
        /// 
        /// Logs the warning message.
        /// 
        /// 
        /// The format.
        /// The args.
        public void WarnFormat(bool isWriteFile, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(format, args));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Warn, log);
            }
        }
        /// 
        /// Logs the warning message.
        /// 
        /// 
        /// The provider.
        /// The format.
        /// The args.
        public void WarnFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
        {
            string log = GetDataTimeLog(string.Format(provider, format, args));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Warn, log);
            }
        }
        /// 
        /// Logs the warning message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        public void WarnFormat(bool isWriteFile, string format, object arg0, object arg1)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Warn, log);
            }
        }
        /// 
        /// Logs the warning message.
        /// 
        /// 
        /// The format.
        /// The arg0.
        /// The arg1.
        /// The arg2.
        public void WarnFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
        {
            string log = GetDataTimeLog(string.Format(format, arg0, arg1, arg2));
            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
            if (isWriteFile)
            {
                LogUtil.WriteLogFile(m_Name, m_Warn, log);
            }
        }
        //public void Behavior(string logMsg, Level level)
        //{
        //    lock (this)
        //    {
        //        m_Name = "行为";
        //        switch (level)
        //        {
        //            case Level.Debug:
        //                Debug(true, logMsg);
        //                break;
        //            case Level.Info:
        //                Info(true, logMsg);
        //                break;
        //            case Level.Warning:
        //                Warn(true, logMsg);
        //                break;
        //            case Level.Error:
        //                Error(true, logMsg);
        //                break;
        //            default:
        //                break;
        //        }
        //    }
        //}
        //public void Interface(string logMsg, Level level)
        //{
        //    lock (this)
        //    {
        //        m_Name = "接口";
        //        switch (level)
        //        {
        //            case Level.Debug:
        //                Debug(true, logMsg);
        //                break;
        //            case Level.Info:
        //                Info(true, logMsg);
        //                break;
        //            case Level.Warning:
        //                Warn(true, logMsg);
        //                break;
        //            case Level.Error:
        //                Error(true, logMsg);
        //                break;
        //            default:
        //                break;
        //        }
        //    }
        //}
        //public void Hardware(string logMsg, Level level)
        //{
        //    lock (this)
        //    {
        //        m_Name = "硬件";
        //        switch (level)
        //        {
        //            case Level.Debug:
        //                Debug(true, logMsg);
        //                break;
        //            case Level.Info:
        //                Info(true, logMsg);
        //                break;
        //            case Level.Warning:
        //                Warn(true, logMsg);
        //                break;
        //            case Level.Error:
        //                Error(true, logMsg);
        //                break;
        //            default:
        //                break;
        //        }
        //    }
        //}
    }
}