using Logger;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ORM
{
        public class SqlSugarContext
        {
            /// <summary>
            /// SqlSugarScope单例模式
            /// </summary>
            public static readonly SqlSugarScope DbContext = new SqlSugarScope(
                new ConnectionConfig()
                {
                    DbType = DatabaseConfig.DbConnectionType,
                    ConnectionString = DatabaseConfig.DbConnectionString, // 连接符字串
                    //ConfigId = "Db1",//管理多个数据库
                    IsAutoCloseConnection = true, // 自动关闭连接
                    InitKeyType = InitKeyType.Attribute // 通过实体类上的特性初始化
                },
                db =>
                {
                    // 执行超时时间，单位秒
                    db.Ado.CommandTimeOut = 30;

                    // 每次SQL执行前事件
                    db.Aop.OnLogExecuting = (sql, pars) =>
                    {
#if DEBUG
                        // 确保 SQL 只通过 sqlLogger 记录
                        LoggerHelper.sqlLogger.Info("Executing SQL: {0} with parameters: {1}", sql, pars); // 使用 NLog 记录 SQL
#endif
                    };

                    // SQL执行完
                    db.Aop.OnLogExecuted = (sql, pars) =>
                    {
                        // 执行时间超过1秒记录慢日志
                        if (db.Ado.SqlExecutionTime.TotalSeconds > 1)
                        {
                              LoggerHelper.sqlLogger.Warn("SQL Slow Execution. Time: {0}, File: {1}, Line: {2}, Method: {3}, SQL: {4}",
                                db.Ado.SqlExecutionTime.ToString(), // SQL 执行时间
                                db.Ado.SqlStackTrace.FirstFileName, // 代码 CS 文件名
                                db.Ado.SqlStackTrace.FirstLine, // 代码行数
                                db.Ado.SqlStackTrace.FirstMethodName, // 代码方法名
                                sql); // 使用 NLog 记录慢 SQL 日志
                        }
                    };

                    // SQL 报错
                    db.Aop.OnError = (exp) =>
                    {
                        // 确保 SQL 错误日志仅通过 sqlLogger 记录
                        LoggerHelper.sqlLogger.Error(exp, "SQL Error: {0}", exp.Sql); // 使用 NLog 记录 SQL 错误日志
                    };

                    // 数据过滤器：例如在新增数据时生成雪花 Id
                    db.Aop.DataExecuting = (oldValue, entityInfo) =>
                    {
                        // 新增操作
                        if (entityInfo.OperationType == DataFilterType.InsertByObject)
                        {
                            // 主键(long)赋值雪花 Id
                            if (entityInfo.EntityColumnInfo.IsPrimarykey && entityInfo.EntityColumnInfo.PropertyInfo.PropertyType == typeof(long))
                            {
                                var id = ((dynamic)entityInfo.EntityValue).Id;
                                if (id == null || id == 0)
                                {
                                    SnowFlakeSingle.WorkId = DatabaseConfig.SnowFlakeWorkId;
                                    SnowFlakeSingle.DatacenterId = DatabaseConfig.SnowFlakeDatacenterId;
                                    entityInfo.SetValue(SnowFlakeSingle.Instance.NextId());
                                }
                            }
                        }
                    };
                }
            );
    }
    }


