using Microsoft.AspNetCore.Builder;
using Serilog;
using Serilog.Events;
using SlnMesnac.Config;
using System;
using System.IO;

#region << 版 本 注 释 >>

/*--------------------------------------------------------------------
* 版权所有 (c) 2024 WenJY 保留所有权利。
* CLR版本：4.0.30319.42000
* 机器名称：LAPTOP-E0N2L34V
* 命名空间：SlnMesnac.Serilog
* 唯一标识：496f8d2b-70e3-4a05-ae18-a9b0fcd06b82
*
* 创建者：WenJY
* 电子邮箱：wenjy@mesnac.com
* 创建时间：2024-03-27 21:58:35
* 版本：V1.0.0
* 描述：
*
*--------------------------------------------------------------------
* 修改人：
* 时间：
* 修改说明：
*
* 版本：V1.0.0
*--------------------------------------------------------------------*/

#endregion << 版 本 注 释 >>

namespace SlnMesnac.Serilog
{
    /// <summary>
    /// Serilog
    /// </summary>
    public static class SerilogExtensions
    {
        // 定义自定义日志级别
        public static readonly LogEventLevel AgvLevel = (LogEventLevel)35;

        //public static IApplicationBuilder UseSerilogExtensions(this IApplicationBuilder app)
        //{
        //    // 获取当前程序所在的目录
        //    string currentDirectory = Directory.GetCurrentDirectory();

        //    Log.Logger = new LoggerConfiguration()
        //       .MinimumLevel.Verbose() // 确保能捕获所有级别日志
        //        .Enrich.With(new CustomLogLevelAbbreviationEnricher()) // 添加自定义日志级别缩写增强器
        //       .WriteTo.Console(
        //        outputTemplate: "{Timestamp:MM-dd HH:mm:ss} [{LevelAbbreviation}] [{ClassName}] [{LineNumber}] {Message:lj}{NewLine}{Exception}",
        //        restrictedToMinimumLevel: LogEventLevel.Error

        //    )
        //       // retainedFileCountLimit: 3, // 保留最近3天日志
        //       .WriteTo.File(path: GetDynamicLogPath("Info"), retainedFileCountLimit: 3, restrictedToMinimumLevel: LogEventLevel.Information, rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{ClassName}] [{LineNumber}] {Message:lj}{NewLine}{Exception}")
        //       .WriteTo.File(path: GetDynamicLogPath("Error"), retainedFileCountLimit: 3, restrictedToMinimumLevel: LogEventLevel.Error, rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{ClassName}] [{LineNumber}] {Message:lj}{NewLine}{Exception}")
        //       .WriteTo.File(path: GetDynamicLogPath("Agv"), retainedFileCountLimit: 3, restrictedToMinimumLevel: AgvLevel, rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{ClassName}] [{LineNumber}] {Message:lj}{NewLine}{Exception}") // 新增 Agv 日志文件
        //       .CreateLogger();

        //    // 启用 Serilog 中间件
        //    app.UseSerilogRequestLogging();

        //    return app;
        //}

        public static IApplicationBuilder UseSerilogExtensions(this IApplicationBuilder app)
        {
            // 获取当前程序所在的目录
            string currentDirectory = Directory.GetCurrentDirectory();
            var logPath = Path.Combine(currentDirectory, "Logs");
            Log.Logger = new LoggerConfiguration()
               .MinimumLevel.Verbose() // 确保能捕获所有级别日志
                .Enrich.With(new CustomLogLevelAbbreviationEnricher()) // 添加自定义日志级别缩写增强器
               .WriteTo.Console(
                outputTemplate: "{Timestamp:MM-dd HH:mm:ss} [{LevelAbbreviation}] [{ClassName}] [{LineNumber}] {Message:lj}{NewLine}{Exception}",
                restrictedToMinimumLevel: LogEventLevel.Error

            )
              // retainedFileCountLimit: 3, // 保留最近3天日志
              .WriteTo.Logger(lc => lc
                .Filter.ByIncludingOnly(logEvent => logEvent.Properties.ContainsKey("Module") && logEvent.Properties["Module"].ToString().Contains("Info"))
                .WriteTo.File(Path.Combine($"{logPath}/Info/", "Info.log"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: 3))
              .WriteTo.Logger(lc => lc
                .Filter.ByIncludingOnly(logEvent => logEvent.Properties.ContainsKey("Module") && logEvent.Properties["Module"].ToString().Contains("Plc"))
                .WriteTo.File(Path.Combine($"{logPath}/Plc/", "Plc.log"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: 3))
              .WriteTo.Logger(lc => lc
                .Filter.ByIncludingOnly(logEvent => logEvent.Properties.ContainsKey("Module") && logEvent.Properties["Module"].ToString().Contains("Agv"))
                .WriteTo.File(Path.Combine($"{logPath}/Agv/", "Agv.log"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: 3))
              .WriteTo.Logger(lc => lc
                .Filter.ByIncludingOnly(logEvent => logEvent.Properties.ContainsKey("Module") && logEvent.Properties["Module"].ToString().Contains("Error"))
                .WriteTo.File(Path.Combine($"{logPath}/Error/", "Error.log"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: 3))
               .CreateLogger();

            // 启用 Serilog 中间件
            app.UseSerilogRequestLogging();

            return app;
        }

        // 新的动态路径生成方法
        private static string GetDynamicLogPath(string logType)
        {
            return Path.Combine(
                Directory.GetCurrentDirectory(),
                "Logs",
                $"{DateTime.UtcNow:yyyy-MM-dd}",
                $"{logType}-.log"
            );
        }
    }
}