using Infrastructure;
using Infrastructure.Extensions;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ZR.CodeGenerator
{
    /// <summary>
    /// 代码生成数据库连接
    /// </summary>
    public class DbProvider
    {
        protected static SqlSugarClient CodeDb;

        /// <summary>
        /// 获取动态连接字符串
        /// </summary>
        /// <param name="dbName">数据库名</param>
        /// <returns></returns>
        public SqlSugarClient GetSugarDbContext(string dbName = "")
        {
            string connStr = AppSettings.GetConfig(GenConstants.Gen_conn);
            int dbType = AppSettings.GetAppConfig(GenConstants.Gen_conn_dbType, 0);

            if (!string.IsNullOrEmpty(dbName))
            {
                string replaceStr = GetValue(connStr, "Database=", ";");
                string replaceStr2 = GetValue(connStr, "Initial Catalog=", ";");
                if (replaceStr.IsNotEmpty())
                {
                    connStr = connStr.Replace(replaceStr, dbName, StringComparison.OrdinalIgnoreCase);
                }
                if (replaceStr2.IsNotEmpty())
                {
                    connStr = connStr.Replace(replaceStr2, dbName, StringComparison.OrdinalIgnoreCase);
                }                
            }
            var db = new SqlSugarClient(new List<ConnectionConfig>()
            {
                new ConnectionConfig(){
                    ConnectionString = connStr,
                    DbType = (DbType)dbType,
                    IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样
                    InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
                },
            });

            CodeDb = db;
            return db;
        }

        /// <summary>
        /// 获得字符串中开始和结束字符串中间得值
        /// </summary>
        /// <param name="str">字符串</param>
        /// <param name="s">开始</param>
        /// <param name="e">结束</param>
        /// <returns></returns> 
        public static string GetValue(string str, string s, string e)
        {
            Regex rg = new Regex("(?<=(" + s + "))[.\\s\\S]*?(?=(" + e + "))", RegexOptions.Multiline | RegexOptions.Singleline);
            return rg.Match(str).Value;
        }
    }
}