using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FrmStandAloneMetering
{

    public class logCsv
    {
        private static LogManager logManager;
        static logCsv()
        {
            logManager = new LogManager();
        }

        /// <summary>
        /// 数据的日志文件
        /// </summary>
        /// <param name="logFile"></param>
        /// <param name="msg"></param>
        public static void WriteDataLog(string logFile, string msg)
        {
            try
            {
                logManager.WriteDataLog(logFile, msg);
            }
            catch
            {
            }
        }

        /// <summary>
        /// 基础的日志文件（物资、收发货单位等）
        /// </summary>
        /// <param name="logFile"></param>
        /// <param name="msg"></param>
        public static void WriteBaseData(string logFile, string msg)
        {
            try
            {
                logManager.WriteBaseData(logFile, msg);
            }
            catch
            {
            }
        }

        public static void WriteLog(LogFile logFile, string msg)
        {
            try
            {
                logManager.WriteLog(logFile, msg);
            }
            catch
            {
            }
        }

        public static void WriteLog(string msg)
        {
            try
            {
                logManager.WriteLog(LogFile.Info, msg);
            }
            catch
            {
            }
        }

        public static void WriteLog(string logFile, string msg)
        {
            try
            {
                logManager.WriteLog(logFile, msg);
            }
            catch
            {

            }
        }
    }

    public class LogManager
    {
        private string logFileName = string.Empty;
        private string logPath = "Log";
        private string logFileExtName = "log";
        private bool writeLogTime = true;
        private bool logFileNameEndWithDate = true;
        private Encoding logFileEncoding = Encoding.UTF8;
        private object obj = new object();


        #region 构造函数
        public LogManager()
        {
            this.LogPath = "Log";
            this.LogFileExtName = "csv";
            this.WriteLogTime = true;
            this.logFileNameEndWithDate = true;
            this.logFileEncoding = Encoding.UTF8;
        }
        public LogManager(string logPath, string logFileExtName, bool writeLogTime)
        {
            this.LogPath = logPath;
            this.LogFileExtName = logFileExtName;
            this.WriteLogTime = writeLogTime;
            this.logFileNameEndWithDate = true;
            this.logFileEncoding = Encoding.UTF8;
        }

        #endregion

        #region 属性
        /// <summary>
        /// Log 文件路径
        /// </summary>
        public string LogPath
        {
            get
            {
                if (this.logPath == null || this.logPath == string.Empty)
                {
                    //Application.StartupPath
                    this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.ToString("yyyy-MM-dd"));
                }
                return this.logPath;
            }
            set
            {
                this.logPath = value;
                if (this.logPath == null || this.logPath == string.Empty)
                {
                    //Application.StartupPath
                    this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.ToString("yyyy-MM-dd"));
                }
                else
                {
                    try
                    {
                        // 判断是否不是绝对路径（绝对路径里还有":"）
                        if (this.logPath.IndexOf(Path.VolumeSeparatorChar) >= 0)
                        { /* 绝对路径 */}
                        else
                        {
                            // 相对路径
                            this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory + this.logPath, DateTime.Now.ToString("yyyy-MM-dd"));
                        }
                        if (!Directory.Exists(this.logPath))
                            Directory.CreateDirectory(this.logPath);
                    }
                    catch
                    {
                        this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.ToString("yyyy-MM-dd"));
                    }
                    if (!this.logPath.EndsWith(@"\"))
                        this.logPath += @"\";
                }
            }
        }


        public string LogPathBase
        {
            get
            {
                if (this.logPath == null || this.logPath == string.Empty)
                {
                    //Application.StartupPath
                    this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory);
                }
                return this.logPath;
            }
            set
            {
                this.logPath = value;
                if (this.logPath == null || this.logPath == string.Empty)
                {
                    //Application.StartupPath
                    this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory);
                }
                else
                {
                    try
                    {
                        // 判断是否不是绝对路径（绝对路径里还有":"）
                        if (this.logPath.IndexOf(Path.VolumeSeparatorChar) >= 0)
                        { /* 绝对路径 */}
                        else
                        {
                            // 相对路径
                            this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory + this.logPath);
                        }
                        if (!Directory.Exists(this.logPath))
                            Directory.CreateDirectory(this.logPath);
                    }
                    catch
                    {
                        this.logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory);
                    }
                    if (!this.logPath.EndsWith(@"\"))
                        this.logPath += @"\";
                }
            }
        }
        /// <summary>
        /// Log 文件扩展名
        /// </summary>
        public string LogFileExtName
        {
            get { return this.logFileExtName; }
            set { this.logFileExtName = value; }
        }

        /// <summary>
        /// 是否在每个Log行前面添加当前时间
        /// </summary>
        public bool WriteLogTime
        {
            get { return this.writeLogTime; }
            set { this.writeLogTime = value; }
        }

        /// <summary>
        /// 日志文件名是否带日期
        /// </summary>
        public bool LogFileNameEndWithDate
        {
            get { return logFileNameEndWithDate; }
            set { logFileNameEndWithDate = value; }
        }

        /// <summary>
        /// 日志文件的字符编码
        /// </summary>
        public Encoding LogFileEncoding
        {
            get { return logFileEncoding; }
            set { logFileEncoding = value; }
        }
        #endregion

        #region 公有方法

        public void WriteDataLog(string logFile, string msg)
        {
            lock (obj)
            {
                try
                {
                    this.LogPath = "alonData";
                    logFileName = string.Format("{0}{1}.{2}",
                                                this.LogPath, //文件夹带年月日时分秒
                                                logFile,
                                                this.logFileExtName);
                    using (StreamWriter sw = new StreamWriter(logFileName, true, logFileEncoding))
                    {
                        sw.WriteLine(msg);
                    }
                }
                catch
                {

                }
            }
        }

        /// <summary>
        /// 基础数据下载
        /// </summary>
        /// <param name="logFile"></param>
        /// <param name="msg"></param>
        public void WriteBaseData(string logFile, string msg)
        {
            lock (obj)
            {
                try
                {
                    this.LogPathBase = "baseData";
                    logFileName = string.Format("{0}{1}.{2}",
                                                this.LogPathBase, //文件夹带年月日时分秒
                                                logFile,
                                                this.logFileExtName);
                    //string basePath = AppDomain.CurrentDomain.BaseDirectory;
                    //logFileName = string.Format("{0}{1}.{2}",
                    //                           //this.LogPath,
                    //                           basePath + "baseData//",
                    //                            logFile,
                    //                            this.logFileExtName);
                    using (StreamWriter sw = new StreamWriter(logFileName, true, logFileEncoding))
                    {
                        sw.WriteLine(msg);
                    }
                }
                catch(Exception exp)
                {
                    string str = exp.ToString();
                }
            }
        }

        public void WriteLog(string logFile, string msg)
        {
            lock (obj)
            {
                try
                {
                    this.LogPath = "Log";
                    logFileName = string.Format("{0}{1}.{2}",
                                                this.LogPath,
                                                logFile,
                                                this.logFileExtName);
                    using (StreamWriter sw = new StreamWriter(logFileName, true, logFileEncoding))
                    {
                        if (writeLogTime)
                        {
                            sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + msg);
                        }
                        else
                        {
                            sw.WriteLine(msg);
                        }
                    }
                }
                catch
                {

                }
            }
        }

        /// <summary>
        /// 一个小时一个文件名，格式为：actualFirst2021090111
        /// </summary>
        /// <param name="logFile"></param>
        /// <param name="msg"></param>
        public void WriteLogHour(string logFile, string msg)
        {
            lock (obj)
            {
                try
                {
                    string dateString = string.Empty;
                    if (this.logFileNameEndWithDate || logFile.Length == 0)
                    {
                        dateString = DateTime.Now.ToString("yyyyMMddHH");
                    }
                    this.LogPath = "Log";
                    logFileName = string.Format("{0}{1}{2}.{3}",
                                                this.LogPath,
                                                logFile,
                                                dateString,
                                                this.logFileExtName);
                    using (StreamWriter sw = new StreamWriter(logFileName, true, logFileEncoding))
                    {
                        if (writeLogTime)
                        {
                            sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + msg);
                        }
                        else
                        {
                            sw.WriteLine(msg);
                        }
                    }
                }
                catch
                {

                }
            }
        }


        public void WriteLog(LogFile logFile, string msg)
        {
            this.WriteLog(logFile.ToString(), msg);
        }

        public void WriteDataLog(LogFile logFile, string msg)
        {
            this.WriteDataLog(logFile.ToString(), msg);
        }

        public void WriteLog(string msg)
        {
            this.WriteLog(string.Empty, msg);
        }

        #endregion
    }

    public enum LogFile
    {
        Trace,
        Error,
        SQL,
        SQLError,
        Login,
        Info,
        WeChat
    }
}
