using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Core;
using Serilog.Events;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Nirvana.Common
{
    public class LogFactory
    {
        public static Logger _logger;
        static LogFactory()
        {

        }

        public static Logger GetLogger(IConfiguration configuration)
        {
            string outputTemplate = "{NewLine}【{Level:u3}】{Timestamp:yyyy-MM-dd HH:mm:ss.fff}" +
                       "{NewLine}#Msg#{Message:lj}" +
                       "{NewLine}#Pro #{Properties:j}" +
                       "{NewLine}#Exc#{Exception}" +
                       new string('-', 50);//输出模板
            string filepath = Configs.GetString("logfile");
            string date = DateTime.Now.ToString("yyyy-MM-dd");//按时间创建文件夹
            _logger = new LoggerConfiguration()
             .ReadFrom.Configuration(configuration)
                //2.1仅输出 LogEventLevel.Debug 类型
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Debug)//筛选过滤
                    .WriteTo.File($"{filepath}/{date}/{LogEventLevel.Debug}.log",
                        outputTemplate: outputTemplate,
                        rollingInterval: RollingInterval.Day,//日志按日保存，这样会在文件名称后自动加上日期后缀
                        encoding: Encoding.UTF8            // 文件字符编码
                     )
                            )

                //2.2仅输出 LogEventLevel.Error 类型
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Error)//筛选过滤
                    .WriteTo.File($"{filepath}/{date}/{LogEventLevel.Error}.log",
                        outputTemplate: outputTemplate,
                        rollingInterval: RollingInterval.Day,//日志按日保存，这样会在文件名称后自动加上日期后缀
                        encoding: Encoding.UTF8            // 文件字符编码
                     )
                   )
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Information)//筛选过滤
                    .WriteTo.File($"{filepath}/{date}/{LogEventLevel.Information}.log",
                        outputTemplate: outputTemplate,
                        rollingInterval: RollingInterval.Day,//日志按日保存，这样会在文件名称后自动加上日期后缀
                        encoding: Encoding.UTF8            // 文件字符编码
                     )
                   )
                  .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Fatal)//筛选过滤
                    .WriteTo.File($"{filepath}/{date}/{LogEventLevel.Fatal}.log",
                        outputTemplate: outputTemplate,
                        rollingInterval: RollingInterval.Day,//日志按日保存，这样会在文件名称后自动加上日期后缀
                        encoding: Encoding.UTF8            // 文件字符编码
                     )
                   )
                    .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Warning)//筛选过滤
                    .WriteTo.File($"{filepath}/{date}/{LogEventLevel.Warning}.log",
                        outputTemplate: outputTemplate,
                        rollingInterval: RollingInterval.Day,//日志按日保存，这样会在文件名称后自动加上日期后缀
                        encoding: Encoding.UTF8            // 文件字符编码
                     )
                   )
                .CreateLogger();
            return _logger;
        }

        public static void InsertErrorLog(string msg, int type = 1)
        {
            msg = $"{msg}";
            switch (type)
            {
                case 1:
                    _logger.Error(msg);
                    break;
                case 2:
                    _logger.Information(msg);
                    break;
                case 3:
                    _logger.Warning(msg);
                    break;
                case 4:
                    _logger.Debug(msg);
                    break;
                case 5:
                    _logger.Fatal(msg);
                    break;
                default:
                    _logger.Error(msg);
                    break;
            }
        }
    }
}
