using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using WMS.Util;
using WMS.Core;
using WMS.Info;
using FreeRedis;
using Newtonsoft.Json;
using System.Reflection;
using Autofac;
using WMS.BZSqlSugar;
namespace WMS.BZWeb
{
    public static class Common
    {
        public static string GetBodyUITheme()
        {
            return SessionCookieCore.GetBodyUITheme();
        }
        public static string GetMainUITheme()
        {
            return SessionCookieCore.GetMainUITheme();
        }
        public static string GetLoginUITheme()
        {
            return SessionCookieCore.GetLoginUITheme();
        }
        public static string GetClientBrowser()
        {
            return "";//NetUtil.Browser;
        }
        public static string GetWMSTile()
        {
            return SysSetCore.GetSysSet().WMSTile;
        }
        public static string GetWMSVersion()
        {
            return SysSetCore.GetSysSet().WMSVersion;
        }
        public static LoginUserInfo GetLoginUserInfo()
        {
            return LoginBLLCore.GetLoginUser();
        }
        /// 
        /// 当前日期
        /// 
        /// 
        public static string GetToday()
        {
            return DateTime.Now.ToString("yyyy-MM-dd");
        }
    }
    /// 
    /// FreeRedis配置选项
    /// 
    public class FreeRedisOption
    {
        /// 
        /// Host
        /// 
        public string RedisHost { get; set; }
        /// 
        /// Port
        /// 
        public int RedisPort { get; set; } = 6379;
        /// 
        /// 密码
        /// 
        public string RedisPassword { get; set; }
        /// 
        /// 同步超时
        /// 
        public int SyncTimeout { get; set; } = 5000;
        /// 
        /// 连接超时
        /// 
        public int ConnectTimeout { get; set; } = 15000;
        /// 
        /// Key前缀
        /// 
        public string Prefix { get; set; }
        /// 
        /// 默认访问第几个
        /// 
        public int DefaultIndex { get; set; } = 0;
        /// 
        /// 池大小
        /// 
        public int Poolsize { get; set; } = 5;
        /// 
        /// 异步管道
        /// 
        public bool asyncPipeline { get; set; } = true;
        /// 
        /// 是否启用客户端缓存(6.0及以上支持)
        /// 
        public bool UseClientSideCache { get; set; }
        /// 
        /// 客户端缓存Key筛选条件
        /// 
        public Func ClientSideCacheKeyFilter { get; set; }
    }
    public class FreeRedisService
    {
        /// 
        /// RedisClient
        /// 
        private static RedisClient _redisClient;
        /// 
        /// 初始化配置
        /// 
        private FreeRedisOption _redisOption;
        /// 
        /// 构造函数
        /// 
        public FreeRedisService(FreeRedisOption redisOption)
        {
            if (redisOption == null)
            {
                throw new NullReferenceException("初始化配置为空");
            }
            _redisOption = redisOption;
            InitRedisClient();
        }
        /// 
        /// 懒加载Redis客户端
        /// 
        private readonly static Lazy redisClientLazy = new Lazy(() => {
            var r = _redisClient;
            r.Serialize = obj => JsonConvert.SerializeObject(obj);
            r.Deserialize = (json, type) => JsonConvert.DeserializeObject(json, type);
            r.Notice += (s, e) => Console.WriteLine(e.Log);
            return r;
        });
        private static readonly object obj = new object();
        /// 
        /// 初始化Redis
        /// 
        /// 
        bool InitRedisClient()
        {
            if (_redisClient == null)
            {
                lock (obj)
                {
                    if (_redisClient == null)
                    {
                        _redisClient = new RedisClient($"{_redisOption.RedisHost}:{_redisOption.RedisPort},password={_redisOption.RedisPassword},defaultDatabase={_redisOption.DefaultIndex},poolsize={_redisOption.Poolsize},ssl=false,writeBuffer=10240,prefix={_redisOption.Prefix},asyncPipeline={_redisOption.asyncPipeline},connectTimeout={_redisOption.ConnectTimeout},abortConnect=false");
                        //设置客户端缓存
                        if (_redisOption.UseClientSideCache)
                        {
                            if (_redisOption.ClientSideCacheKeyFilter == null)
                            {
                                throw new NullReferenceException("如果开启客户端缓存,必须设置客户端缓存Key过滤条件");
                            }
                            _redisClient.UseClientSideCaching(new ClientSideCachingOptions()
                            {
                                Capacity = 0,  //本地缓存的容量,0不限制
                                KeyFilter = _redisOption.ClientSideCacheKeyFilter,  //过滤哪些键能被本地缓存
                                CheckExpired = (key, dt) => DateTime.Now.Subtract(dt) > TimeSpan.FromSeconds(3)  //检查长期未使用的缓存
                            });
                        }
                        return true;
                    }
                }
            }
            return _redisClient != null;
        }
        /// 
        /// 获取Client实例
        /// 
        public RedisClient Instance
        {
            get
            {
                if (InitRedisClient())
                {
                    return redisClientLazy.Value;
                }
                throw new NullReferenceException("Redis不可用");
            }
        }
    }
    public class AutoFacManager : Autofac.Module
    {
        //重写Autofac管道Load方法,在这里注册注入
        protected override void Load(ContainerBuilder builder)
        {        
            //程序集注入业务服务 
            var AppServices = Assembly.Load("WMS.BZServices");
            //根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖 
            builder.RegisterAssemblyTypes(AppServices).Where(t => t.Name.EndsWith("Service")).AsSelf().PropertiesAutowired();
        }
    }
}