using log4net;
using log4net.Repository;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.Helper
{
    /// <summary>
    /// 创建人：奉友福
    /// 时间：2021/11/12
    /// </summary>
    public class logHelper
    {
        #region 单例模式
        static private logHelper m_logHelperInstance = null;
        public static logHelper GetLogConfigInstance()
        {
            if (null == m_logHelperInstance)
            {
                m_logHelperInstance = new logHelper();

            }
            return m_logHelperInstance;
        }
        #endregion
        /// <summary>
        /// 日志显示委托
        /// </summary>
        public Action<string> InfoNotify { get; set; }
        public ILog directLogger = null;
        public log4net.Appender.RollingFileAppender directRollfileAppender = null;
        ILoggerRepository logRepos = null;
        private static bool m_isInitDirectLog = false;  //是否初始化了直接写入日志文件
        private static Int32 directFileSize = 50;
        private static string directLogDir = string.Empty;
        private static string directLogFileName = string.Empty;
        //static private UAFLogHelper uafLogInstance = null;
        private LogLevel logLevel = LogLevel.ALL;

        /// <summary>
        /// 初始化日志
        /// </summary>
        /// <param name="path"></param>
        public static void Fun_InitLog(string path)
        {
            try
            {
                /// 设置需要的日志信息
                GetLogConfigInstance().SetConfigEnableThreadId(true);
                GetLogConfigInstance().SetConfigEnableAppDomain(true);

                /// 使用直接日志接口写入日志信息
                GetLogConfigInstance().SetLogLevel(LogLevel.ERROR);
                GetLogConfigInstance().SetDirectFileLogInfo(5, string.Empty);
                GetLogConfigInstance().SetDirectFileLogName("HBL.LogDir");
                if (!(GetLogConfigInstance().initDirectLogger(path)))
                {

                }
            }
            catch (Exception ex)
            {
            }
        }
        public void SetDirectFileLogInfo(Int32 fileSize, string logDirectory)
        {
            directFileSize = fileSize;
            directLogDir = logDirectory;
        }

        public void SetDirectFileLogName(string logFileName)
        {
            directLogFileName = logFileName;
        }

        //初始化日志实例
        public bool initDirectLogger(string loggerName)
        {
            try
            {
                logRepos = log4net.LogManager.CreateRepository(loggerName);
                //初始化记录日志到文件的 appender
                InitDirectRollFileAppender(loggerName);

                m_isInitDirectLog = true;

                return true;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        private void InitDirectRollFileAppender(string loggerName)
        {
            try
            {
                directLogger = LogManager.GetLogger(logRepos.Name, loggerName);
                //初始化记录日志到文件的 appender
                directRollfileAppender = new log4net.Appender.RollingFileAppender();

                // pattern layout
                log4net.Layout.PatternLayout layout = new log4net.Layout.PatternLayout();
                //UAFCustomDataDB.UAFCustomLayout layout = new UAFCustomDataDB.UAFCustomLayout();
                //layout.ConversionPattern = "%log_time %log_threadname %log_ip %-5level %log_domain %log_location %log_msg %log_details%n"; // pattern

                layout.ConversionPattern = string.Empty;
                if (LogConfig.GetLogConfigInstance().EnableDate)
                {
                    layout.ConversionPattern += "%date{yyyy-MM-dd HH:mm:ss} ";
                }

                //级别
                layout.ConversionPattern += "%-5level ";

                if (LogConfig.GetLogConfigInstance().EnableAppDomain)
                {
                    layout.ConversionPattern += "%a ";
                }

                if (LogConfig.GetLogConfigInstance().EnableThreadId)
                {
                    layout.ConversionPattern += "[%t] ";
                }

                layout.ConversionPattern += "%m%n";

                layout.ActivateOptions(); // activate

                //directRollfileAppender.CloseFlag = false;  //添加打开标志
                directRollfileAppender.Layout = layout; // layout pattern
                //directRollfileAppender.Name = "DirectLogRollFileAppender";
                directRollfileAppender.Name = loggerName;

                directRollfileAppender.File = string.Empty;

                //设置日志文件路径
                if (string.Empty == directLogDir)
                {
                    directRollfileAppender.File = "LogDir\\";
                }

                else
                {
                    if (directLogDir.EndsWith("\\"))
                    {
                        directRollfileAppender.File = directLogDir;
                    }
                    else
                    {
                        directRollfileAppender.File = directLogDir + "\\";
                    }
                }
                //设置日志文件名字
                if (string.Empty == directLogFileName)
                {
                    //获取进程Id，构造日志文件名字
                    string loggerFileName = Process.GetCurrentProcess().ProcessName
                                   + Process.GetCurrentProcess().Id.ToString() + "_"
                                   + DateTime.Now.Year.ToString()
                                   + DateTime.Now.Month.ToString()
                                   + DateTime.Now.Day.ToString()
                                   + DateTime.Now.Hour.ToString()
                                   + DateTime.Now.Minute.ToString()
                                   + DateTime.Now.Second.ToString()
                                   + DateTime.Now.Millisecond.ToString() + "_";//"UAFMsgName";
                    directRollfileAppender.File += loggerFileName;
                }
                else
                {
                    directRollfileAppender.File += directLogFileName;
                }

                directRollfileAppender.AppendToFile = true; // overwrite any existin g file with the same name
                if (directFileSize <= 0)
                {
                    directRollfileAppender.MaxFileSize = (50 * 1024 * 1024); // max file size - 50*1024*1024 = 50MB
                }
                else
                {
                    directRollfileAppender.MaxFileSize = (directFileSize * 1024 * 1024);
                }

                directRollfileAppender.MaxSizeRollBackups = 50; // keep 50 files
                directRollfileAppender.ImmediateFlush = true; // flush after every append
                directRollfileAppender.Threshold = log4net.Core.Level.All;
                directRollfileAppender.DatePattern = "yyyy_M_d'.log'";
                directRollfileAppender.StaticLogFileName = false;

                directRollfileAppender.ActivateOptions(); // activate



                // add appenders
                //log4net.Config.BasicConfigurator.Configure(directRollfileAppender);
                log4net.Config.BasicConfigurator.Configure(logRepos, directRollfileAppender);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        //重新设置日志保存路径和文件名
        public void ReconfigLogDirAndName()
        {
            directRollfileAppender.File = string.Empty;

            //设置日志文件路径
            if (string.Empty == directLogDir)
            {
                directRollfileAppender.File = "LogDir\\";
            }

            else
            {
                if (directLogDir.EndsWith("\\"))
                {
                    directRollfileAppender.File = directLogDir;
                }
                else
                {
                    directRollfileAppender.File = directLogDir + "\\";
                }
            }
            //设置日志文件名字
            if (string.Empty == directLogFileName)
            {
                //获取进程Id，构造日志文件名字
                string loggerFileName = Process.GetCurrentProcess().ProcessName
                               + Process.GetCurrentProcess().Id.ToString() + "_"
                               + DateTime.Now.Year.ToString()
                               + DateTime.Now.Month.ToString()
                               + DateTime.Now.Day.ToString()
                               + DateTime.Now.Hour.ToString()
                               + DateTime.Now.Minute.ToString()
                               + DateTime.Now.Second.ToString()
                               + DateTime.Now.Millisecond.ToString() + "_";//"UAFMsgName";
                directRollfileAppender.File += loggerFileName;
            }
            else
            {
                directRollfileAppender.File += directLogFileName;
            }

            if (directFileSize <= 0)
            {
                directRollfileAppender.MaxFileSize = (50 * 1024 * 1024); // max file size - 50*1024*1024 = 50MB
            }
            else
            {
                directRollfileAppender.MaxFileSize = (directFileSize * 1024 * 1024);
            }

            directRollfileAppender.ActivateOptions(); // activate
        }

        public void SetLogLevel(LogLevel level)
        {
            logLevel = level;

        }

        public bool WriteLog(LogLevel level, string logMsg)
        {
            try
            {
                if (null == directLogger)
                {
                    return false;
                }

                //if ((LogLevel.OFF == logLevel) || ((Int32)level > (Int32)logLevel /*&& LogObjectLib.LogLevel.ALL != logLevel*/))
                //{
                //    return true;
                //}

                //调用日志接口直接写日志信息
                switch (level)
                {
                    case LogLevel.FATAL:
                        if (directLogger.IsFatalEnabled)
                        {
                            directLogger.Fatal(logMsg);
                        }
                        break;
                    case LogLevel.ERROR:
                        if (directLogger.IsErrorEnabled)
                        {
                            directLogger.Error(logMsg);
                        }
                        break;
                    case LogLevel.WARN:
                        if (directLogger.IsWarnEnabled)
                        {
                            directLogger.Warn(logMsg);
                        }
                        break;
                    case LogLevel.INFO:
                        if (directLogger.IsInfoEnabled)
                        {
                            directLogger.Info(logMsg);
                        }
                        break;
                    case LogLevel.DEBUG:
                        if (directLogger.IsDebugEnabled)
                        {
                            directLogger.Debug(logMsg);
                        }
                        break;
                    default:
                        break;
                }
                if (InfoNotify != null)
                {
                    logMsg = $"{DateTime.Now.ToString("HH:mm:ss")}：{level} {logMsg} \n\r";
                    InfoNotify(logMsg);
                }
                return true;
            }
            catch (Exception e)
            {
                throw e;
            }


        }

        //设置日志配置--app域名
        public void SetConfigEnableAppDomain(bool value)
        {
            LogConfig.GetLogConfigInstance().EnableAppDomain = value;
        }

        //设置日志配置--线程id
        public void SetConfigEnableThreadId(bool value)
        {
            LogConfig.GetLogConfigInstance().EnableThreadId = value;
        }

        public bool GetConfigEnableAppDomain()
        {
            return LogConfig.GetLogConfigInstance().EnableAppDomain;
        }

        public bool GetConfigEnableThreadId()
        {
            return LogConfig.GetLogConfigInstance().EnableThreadId;
        }

        /// <summary>
        /// 打开指定路径下文件
        /// </summary>
        public void OpenFile(string NewFileName)
        {
            Process process = new Process();
            ProcessStartInfo processStartInfo = new ProcessStartInfo(NewFileName);
            process.StartInfo = processStartInfo;
            #region 下面这段被注释掉代码（可以用来全屏打开代码）
            //建立新的系统进程
            ////System.Diagnostics.Process process = new System.Diagnostics.Process();
            //设置文件名，此处为图片的真实路径 + 文件名（需要有后缀）    
            ////process.StartInfo.FileName = NewFileName;
            //此为关键部分。设置进程运行参数，此时为最大化窗口显示图片。    
            ////process.StartInfo.Arguments = "rundll32.exe C://WINDOWS//system32//shimgvw.dll,ImageView_Fullscreen";
            // 此项为是否使用Shell执行程序，因系统默认为true，此项也可不设，但若设置必须为true
            process.StartInfo.UseShellExecute = true;
            #endregion
            try
            {
                process.Start();
                try
                {
                    // process.WaitForExit();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                try
                {
                    if (process != null)
                    {
                        process.Close();
                        process = null;
                    }
                }
                catch { }
            }
        }
    }

    /// <summary>
    /// 创建人：奉友福
    /// </summary>
    public class LogConfig
    {
        private bool m_enableDate = true;
        private bool m_enableAppDomain = false;
        private bool m_enableThreadId = false;
        #region 单例模式
        static private LogConfig m_logConfigInstance = null;
        public static LogConfig GetLogConfigInstance()
        {
            if (null == m_logConfigInstance)
            {
                m_logConfigInstance = new LogConfig();

            }
            return m_logConfigInstance;
        }
        #endregion
        private LogConfig()
        {

        }
        public bool EnableDate
        {
            set
            {
                m_enableDate = value;
            }
            get { return m_enableDate; }
        }
        public bool EnableAppDomain
        {
            set
            {
                m_enableAppDomain = value;
            }
            get { return m_enableAppDomain; }
        }
        public bool EnableThreadId
        {
            set
            {
                m_enableThreadId = value;
            }
            get { return m_enableThreadId; }
        }
    }

    /// <summary>
    /// 创建人：奉友福
    /// 时间：2021/11/12
    /// </summary>
    public enum LogLevel
    {
        OFF = 0,
        FATAL,
        ERROR,
        WARN,
        INFO,
        DEBUG,
        ALL
    }
}
