using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Const;
using WIDESEA_Core.DB;
using WIDESEA_Core.Helper;
namespace WIDESEA_Core.Seed
{
    public class DBContext
    {
        private static MutiDBOperate connectObject => GetMainConnectionDb();
        private static string _connectionString = connectObject.Connection;
        private static DbType _dbType = (DbType)connectObject.DbType;
        public static string ConnId = connectObject.ConnId;
        private SqlSugarClient _db;
        /// 
        /// 连接字符串 
        /// 
        public static MutiDBOperate GetMainConnectionDb()
        {
            MutiDBOperate mainDb = new MutiDBOperate()
            {
                Connection = AppSettings.Get(MainDb.ConnectionString).DecryptDES(AppSecret.DB),
                ConnId = MainDb.CurrentDbConnId,
                DbType = DataBaseType.SqlServer
            };
            return mainDb;
        }
        /// 
        /// 连接字符串 
        /// 
        public static string ConnectionString
        {
            get { return _connectionString; }
            set { _connectionString = value; }
        }
        /// 
        /// 数据库类型 
        /// 
        public static DbType DbType
        {
            get { return _dbType; }
            set { _dbType = value; }
        }
        /// 
        /// 数据连接对象 
        /// 
        public SqlSugarClient Db
        {
            get { return _db; }
            private set { _db = value; }
        }
        //public SqlSugarScope DbClient
        //{
        //    get { return _dbClient; }
        //    private set { _dbClient = value; }
        //}
        /// 
        /// 功能描述:构造函数
        /// 
        public DBContext(ISqlSugarClient sqlSugarClient)
        {
            if (string.IsNullOrEmpty(_connectionString))
                throw new ArgumentNullException("数据库连接字符串为空");
            _db = sqlSugarClient as SqlSugarClient;
            //_db.Aop.DataExecuting = SqlSugarAop.DataExecuting;
        }
        #region 实例方法
        /// 
        /// 功能描述:获取数据库处理对象
        /// 
        /// 返回值
        public SimpleClient GetEntityDB() where T : class, new()
        {
            return new SimpleClient(_db);
        }
        /// 
        /// 功能描述:获取数据库处理对象
        /// 
        /// db
        /// 返回值
        //public SimpleClient GetEntityDB(SqlSugarClient db) where T : class, new()
        //{
        //    return new SimpleClient(db);
        //}
        #endregion
        #region 根据实体类生成数据库表
        /// 
        /// 功能描述:根据实体类生成数据库表
        /// 
        /// 是否备份表
        /// 指定的实体
        public void CreateTableByEntity(bool blnBackupTable, params T[] lstEntitys) where T : class, new()
        {
            Type[] lstTypes = null;
            if (lstEntitys != null)
            {
                lstTypes = new Type[lstEntitys.Length];
                for (int i = 0; i < lstEntitys.Length; i++)
                {
                    T t = lstEntitys[i];
                    lstTypes[i] = typeof(T);
                }
            }
            CreateTableByEntity(blnBackupTable, lstTypes);
        }
        /// 
        /// 功能描述:根据实体类生成数据库表
        /// 
        /// 是否备份表
        /// 指定的实体
        public void CreateTableByEntity(bool blnBackupTable, params Type[] lstEntitys)
        {
            if (blnBackupTable)
            {
                _db.CodeFirst.BackupTable().InitTables(lstEntitys); //change entity backupTable            
            }
            else
            {
                _db.CodeFirst.InitTables(lstEntitys);
            }
        }
        #endregion
        #region 静态方法
        ///// 
        ///// 功能描述:获得一个DbContext
        ///// 
        ///// 
        //public static MyContext GetDbContext()
        //{
        //    return new MyContext();
        //}
        /// 
        /// 功能描述:设置初始化参数
        /// 
        /// 连接字符串
        /// 数据库类型
        public static void Init(string strConnectionString, DbType enmDbType = SqlSugar.DbType.SqlServer)
        {
            _connectionString = strConnectionString;
            _dbType = enmDbType;
        }
        /// 
        /// 功能描述:创建一个链接配置
        /// 
        /// 是否自动关闭连接
        /// 是否夸类事务
        /// ConnectionConfig
        public static ConnectionConfig GetConnectionConfig(bool blnIsAutoCloseConnection = true, bool blnIsShardSameThread = false)
        {
            ConnectionConfig config = new ConnectionConfig()
            {
                ConnectionString = _connectionString,
                DbType = _dbType,
                IsAutoCloseConnection = blnIsAutoCloseConnection,
                ConfigureExternalServices = new ConfigureExternalServices()
                {
                    //DataInfoCacheService = new HttpRuntimeCache()
                },
                //IsShardSameThread = blnIsShardSameThread
            };
            return config;
        }
        /// 
        /// 功能描述:获取一个自定义的DB
        /// 
        /// config
        /// 返回值
        public static SqlSugarClient GetCustomDB(ConnectionConfig config)
        {
            return new SqlSugarClient(config);
        }
        /// 
        /// 功能描述:获取一个自定义的数据库处理对象
        /// 
        /// sugarClient
        /// 返回值
        public static SimpleClient GetCustomEntityDB(SqlSugarClient sugarClient) where T : class, new()
        {
            return new SimpleClient(sugarClient);
        }
        /// 
        /// 功能描述:获取一个自定义的数据库处理对象
        /// 
        /// config
        /// 返回值
        public static SimpleClient GetCustomEntityDB(ConnectionConfig config) where T : class, new()
        {
            SqlSugarClient sugarClient = GetCustomDB(config);
            return GetCustomEntityDB(sugarClient);
        }
        #endregion
    }
}