using APT.BaseData.Domain.ApiModel.Platform;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Entities.OP;
using APT.BaseData.Domain.Enums.OP;
using APT.BaseData.Domain.IServices.OP;
using APT.Infrastructure.Api;
using APT.Infrastructure.Api.Redis;
using APT.Infrastructure.Core;
using APT.Migrations;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
namespace APT.BaseData.Services.Services.OP
{
    public class OPTenantDBConnService : CommonService, IOPTenantDBConnService
    {
        public OPTenantDBConnService(IRepository repository) : base(repository)
        {
        }
        /// 
        /// 获取 除 ORG_IDBeside 之外对应的数据库链接字典  ORG_ID  DB_CONN
        /// 
        /// 过滤值 没有就不过滤
        /// 
        public Dictionary GetConnDictionary(Guid? ORG_IDBeside)
        {
            Dictionary dicORGCONN = new Dictionary();
            //从Redis中获取所有数据库链接值
            bool isRedisConfig = true;
            var redisConfig = APT.Infrastructure.Api.ConfigurationManager.AppSettings["RedisFormConfig"];
            if (!string.IsNullOrEmpty(redisConfig))
                isRedisConfig = bool.Parse(redisConfig);
            if (isRedisConfig)
            {
                if (CsRedisManager.KeyExists(RedisCacheKey.ConnAll))
                    dicORGCONN = CsRedisManager.StringGet>(RedisCacheKey.ConnAll);
            }
            #region    Redis没找到 去数据库查找
            if (dicORGCONN == null || dicORGCONN.Count < 1)
            {
                string conn = string.Empty;
                IEnumerable listTent = null;
                using (var context = new MigrationContext())
                {
                    Expression> expression = e => e.DB_CONN_ID.HasValue;
                    listTent = context.GetEntities(expression, null, null);
                    List listConnID = listTent.Select(e => e.DB_CONN_ID.Value).ToList();
                    var listDbConn = context.GetEntities(e => listConnID.Contains(e.ID), null, null);
                    if (listDbConn != null && listDbConn.Count() > 0)
                    {
                        var env = ConfigurationManager.AppSettings["Env"];
                        foreach (var item in listDbConn)
                        {
                            conn = item.DB_CONN;
                            if (env == ((int)EnvType.外网).ToString())
                            {
                                conn = item.DB_CONN_WAN;
                            }
                            if (!dicORGCONN.ContainsKey(item.ID))
                            {
                                dicORGCONN.Add(listTent.First(e => e.DB_CONN_ID == item.ID).ID, conn);
                            }
                        }
                        if (isRedisConfig && dicORGCONN.Count > 0)
                        {
                            try
                            {
                                CsRedisManager.StringSet>(RedisCacheKey.ConnAll, dicORGCONN);//所有数据库链接 存入 Redis
                            }
                            catch { }
                        }
                    }
                }
            }
            #endregion
            if (dicORGCONN != null && dicORGCONN.Count > 0)
            {
                if (ORG_IDBeside.HasValue)
                {
                    Dictionary dicORGCONN1 = new Dictionary();
                    foreach (var item in dicORGCONN)
                    {
                        if (item.Key == ORG_IDBeside.Value)
                            continue;
                        dicORGCONN1.Add(item.Key, item.Value);
                    }
                    dicORGCONN = dicORGCONN1;
                }
            }
            return dicORGCONN;
        }
        /// 
        /// 获取 ORG_ID的数据库链接
        /// 
        /// 过滤值
        /// 
        public string GetConnByORGID(Guid ORG_ID)
        {
            Dictionary dicORGCONN = new Dictionary();
            //从Redis中获取所有数据库链接值
            bool isRedisConfig = true;
            var redisConfig = APT.Infrastructure.Api.ConfigurationManager.AppSettings["RedisFormConfig"];
            if (!string.IsNullOrEmpty(redisConfig))
                isRedisConfig = bool.Parse(redisConfig);
            if (isRedisConfig)
            {
                if (CsRedisManager.KeyExists(RedisCacheKey.ConnAll))
                    dicORGCONN = CsRedisManager.StringGet>(RedisCacheKey.ConnAll);
            }
            #region    Redis没找到 去数据库查找
            if (dicORGCONN == null || dicORGCONN.Count < 1)
            {
                string conn = string.Empty;
                IEnumerable listTent = null;
                using (var context = new MigrationContext())
                {
                    Expression> expression = e => e.DB_CONN_ID.HasValue;
                    listTent = context.GetEntities(expression, null, null);
                    List listConnID = listTent.Select(e => e.DB_CONN_ID.Value).ToList();
                    var listDbConn = context.GetEntities(e => listConnID.Contains(e.ID), null, null);
                    if (listDbConn != null && listDbConn.Count() > 0)
                    {
                        var env = ConfigurationManager.AppSettings["Env"];
                        foreach (var item in listDbConn)
                        {
                            conn = item.DB_CONN;
                            if (env == ((int)EnvType.外网).ToString())
                            {
                                conn = item.DB_CONN_WAN;
                            }
                            if (!dicORGCONN.ContainsKey(item.ID))
                            {
                                dicORGCONN.Add(listTent.First(e => e.DB_CONN_ID == item.ID).ID, conn);
                            }
                        }
                        if (isRedisConfig && dicORGCONN.Count > 0)
                        {
                            try
                            {
                                CsRedisManager.StringSet>(RedisCacheKey.ConnAll, dicORGCONN);//所有数据库链接 存入 Redis
                            }
                            catch { }
                        }
                    }
                }
            }
            #endregion
            if (dicORGCONN != null && dicORGCONN.Count > 0 && dicORGCONN.ContainsKey(ORG_ID))
            {
                return dicORGCONN[ORG_ID];
            }
            return "";
        }
        /// 
        /// 根据ORGID 获取 Tenant
        /// 
        /// 
        /// 
        public string GetTenantByORGID(Guid ORG_ID)
        {
            Dictionary dicORGCONN = new Dictionary();
            //从Redis中获取所有数据库链接值
            bool isRedisConfig = true;
            var redisConfig = APT.Infrastructure.Api.ConfigurationManager.AppSettings["RedisFormConfig"];
            if (!string.IsNullOrEmpty(redisConfig))
                isRedisConfig = bool.Parse(redisConfig);
            if (isRedisConfig)
            {
                if (CsRedisManager.KeyExists(RedisCacheKey.TenantAll))
                    dicORGCONN = CsRedisManager.StringGet>(RedisCacheKey.TenantAll);
            }
            #region    Redis没找到 去数据库查找
            if (dicORGCONN == null || dicORGCONN.Count < 1)
            {
                string conn = string.Empty;
                IEnumerable listTent = null;
                using (var context = new MigrationContext())
                {
                    Expression> expression = e => e.DB_CONN_ID.HasValue;
                    listTent = context.GetEntities(expression, null, null);
                    if (listTent != null && listTent.Count() > 0)
                    {
                        foreach (var item in listTent)
                        {
                            if (!dicORGCONN.ContainsKey(item.ID))
                            {
                                dicORGCONN.Add(item.ID, item.CODE);
                            }
                        }
                    }
                }
            }
            #endregion
            if (dicORGCONN != null && dicORGCONN.Count > 0 && dicORGCONN.ContainsKey(ORG_ID))
            {
                return dicORGCONN[ORG_ID];
            }
            return "";
        }
    }
}