using OASystem.Domain.Entities.PersonnelModule;
using OASystem.Domain.Entities.System;
using OASystem.Domain.ViewModels.PersonnelModule;
using OASystem.Infrastructure.Repositories.Groups;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;

namespace OASystem.API.OAMethodLib
{
  
    public static class GeneralMethod
    {

       


        #region 消息



        #endregion

        #region md5 加密

        /// <summary>
        /// MD5加密,和动网上的16/32位MD5加密结果相同,
        /// 使用的UTF8编码
        /// </summary>
        /// <param name="source">待加密字串</param>
        /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
        /// <returns>加密后的字串</returns>
        public static string Encrypt(string source, int length = 32)
        {
            if (string.IsNullOrWhiteSpace(source))
                return string.Empty;
            HashAlgorithm hashAlgorithm = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
            byte[] bytes = Encoding.UTF8.GetBytes(source);
            byte[] hashValue = hashAlgorithm.ComputeHash(bytes);
            StringBuilder sb = new StringBuilder();
            switch (length)
            {
                case 16://16位密文是32位密文的9到24位字符
                    for (int i = 4; i < 12; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                case 32:
                    for (int i = 0; i < 16; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                default:
                    for (int i = 0; i < hashValue.Length; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
            }
            return sb.ToString();
        }


        #endregion

        #region jwt

        /// <summary>
        ///  获取token 
        /// </summary>
        /// <param name="_config"></param>
        /// <param name="Number"></param>
        /// <param name="exp"></param>
        /// <returns></returns>
        public static string GetToken(IConfiguration _config,string Number,DateTime exp) 
        {
            var claims = new[] {
                new Claim(ClaimTypes.NameIdentifier, "Future"),
                new Claim("Number",Number)
            };
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtSecurityKey"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                issuer: "OASystem.com",
                audience: "OASystem.com",
                claims: claims,
                expires: exp,
                signingCredentials: creds);
           
            
            return   new JwtSecurityTokenHandler().WriteToken(token);

        }


        #endregion

        #region  数据类型转换

        /// <summary>
        /// object 转 Int
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static int GetInt(this object obj)
        {
            if (obj == null)
                return 0;
            int _number = 0;
            bool reslut = Int32.TryParse(obj.ToString(), out _number);
            return _number;

        }

        private static DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);
        private static long longTime = 621355968000000000;
        private static int samllTime = 10000000;
        
        /// <summary>
        /// 时间戳 转 datetime
        /// </summary>
        /// <param name="timeStamp"></param>
        /// <returns></returns>
        public static DateTime GetTimeSpmpToDate(this object timeStamp)
        {
            if (timeStamp == null) return dateStart;
            DateTime dateTime = new DateTime(longTime + Convert.ToInt64(timeStamp) * samllTime, DateTimeKind.Utc).ToLocalTime();
            return dateTime;
        }

        #endregion


        #region 用户页面操作功能
        //团组信息
        private readonly static DelegationInfoRepository _dirRep = AutofacIocManager.Instance.GetService<DelegationInfoRepository>();

        /// <summary>
        /// 用户页面操作功能(可使用)
        /// </summary>
        /// <param name="userId">用户Id</param>
        /// <param name="PageId">页面Id</param>
        /// <returns></returns>
        public static async Task<PageFunAuthViewBase> PostUserPageFuncDatas(int userId,int PageId)
        {
            PageFunAuthViewBase pageFunAuth = new PageFunAuthViewBase();

            List<UserPageFuncView> userPageFuncDatas = new List<UserPageFuncView>();
            string sql = string.Format(@"Select Distinct ua.UId As UserId, u.CnName As UserName, pa.ModuleId,pa.ModuleName,pa.PageId,pa.PageName,pa.PageIsEnable,
					                     pa.PagePhoneIsEnable,pa.FuncId,pa.FuncName,pa.FuncIsEnable
					                     From Sys_UserAuthority ua
					                     Left Join Sys_Users u On ua.UId = u.Id
					                     Left Join (
						                     Select sd.Id As ModuleId,sd.Name As ModuleName, smp.Id As PageId,smp.Name As PageName,smp.IsEnable As PageIsEnable,
						                     smp.phoneIsEnable As PagePhoneIsEnable,pfp.Id As FuncId,pfp.FunctionName As FuncName,pfp.IsEnable As FuncIsEnable
						                     From  Sys_SystemMenuAndFunction smaf
						                     Left Join Sys_SystemMenuPermission smp On smaf.SmId = smp.Id
						                     Left Join Sys_SetData sd On sd.STid = 5 And smp.Mid = sd.Id
						                     Left Join Sys_PageFunctionPermission pfp On smaf.FId = pfp.Id
						                     Where smaf.IsDel = 0 And smp.IsDel = 0 And pfp.IsDel = 0 And sd.IsDel = 0
					                     ) As pa On ua.SmId = pa.PageId
					                     Where ua.IsDel = 0 And ua.UId = {0} And pa.PageId = {1}
					                     Order By ModuleId,PageId,FuncId Asc", userId, PageId);

            userPageFuncDatas = await _dirRep._sqlSugar.SqlQueryable<UserPageFuncView>(sql).ToListAsync();

            if (userPageFuncDatas.Count <= 0)
            {
                return pageFunAuth;
            }

            UserPageFuncView userPageFunc = new UserPageFuncView();

            //查询 1
            userPageFunc = userPageFuncDatas.Where(it => it.FuncId == 1).FirstOrDefault();
            if (userPageFunc != null) pageFunAuth.CheckAuth = 1;
            //删除 2
            userPageFunc = userPageFuncDatas.Where(it => it.FuncId == 2).FirstOrDefault();
            if (userPageFunc != null) pageFunAuth.DeleteAuth = 1;
            //编辑 3
            userPageFunc = userPageFuncDatas.Where(it => it.FuncId == 3).FirstOrDefault();
            if (userPageFunc != null) pageFunAuth.EditAuth = 1;
            //下载 4
            userPageFunc = userPageFuncDatas.Where(it => it.FuncId == 4).FirstOrDefault();
            if (userPageFunc != null) pageFunAuth.FilesDownloadAuth = 1;
            //上传 5
            userPageFunc = userPageFuncDatas.Where(it => it.FuncId == 5).FirstOrDefault();
            if (userPageFunc != null) pageFunAuth.FilesUploadAuth = 1;
            //添加 11
            userPageFunc = userPageFuncDatas.Where(it => it.FuncId == 11).FirstOrDefault();
            if (userPageFunc != null) pageFunAuth.AddAuth = 1;
            //审核 12
            userPageFunc = userPageFuncDatas.Where(it => it.FuncId == 12).FirstOrDefault();
            if (userPageFunc != null) pageFunAuth.AuditAuth = 1;

            return pageFunAuth;
        }

        #endregion
    }
}