using Microsoft.AspNetCore.Http;
namespace IRaCIS.Core.Domain.Share
{
    /// 
    /// 用户信息
    /// 
    public class UserInfo : IUserInfo
    {
        private readonly IHttpContextAccessor _accessor;
        public UserInfo(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }
        /// 
        /// 用户角色Id  
        /// 
        public Guid UserRoleId
        {
            get
            {
                var id = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserRoleId);
                if (id != null && !string.IsNullOrEmpty(id.Value))
                {
                    return Guid.Parse(id.Value);
                }
                return Guid.Empty;
            }
        }
        /// 
        /// 真实用户Id
        /// 
        public Guid IdentityUserId
        {
            get
            {
                var id = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.IdentityUserId);
                if (id != null && !string.IsNullOrEmpty(id.Value))
                {
                    return Guid.Parse(id.Value);
                }
                return Guid.Empty;
            }
        }
        public Guid UserTypeId
        {
            get
            {
                var userTypeId = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeId);
                if (userTypeId != null && !string.IsNullOrEmpty(userTypeId.Value))
                {
                    return Guid.Parse(userTypeId.Value);
                }
                return Guid.Empty;
            }
        }
        /// 
        /// 用户名
        /// 
        public string UserName
        {
            get
            {
                var name = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserName);
                if (name != null && !string.IsNullOrEmpty(name.Value))
                {
                    return name.Value;
                }
                return "";
            }
        }
        public string FullName
        {
            get
            {
                var name = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.FullName);
                if (name != null && !string.IsNullOrEmpty(name.Value))
                {
                    return name.Value;
                }
                return "";
            }
        }
        public string UserTypeShortName
        {
            get
            {
                var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName);
                if (userType != null && !string.IsNullOrEmpty(userType.Value))
                {
                    return userType.Value;
                }
                return string.Empty;
            }
        }
        public string UserTypeEnumStr
        {
            get
            {
                var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeEnum);
                if (userType != null && !string.IsNullOrEmpty(userType.Value))
                {
                    return userType.Value;
                }
                return UserTypeEnum.ShareImage.ToString();
            }
        }
        public int UserTypeEnumInt
        {
            get
            {
                var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeEnumInt);
                if (userType != null && !string.IsNullOrEmpty(userType.Value))
                {
                    return int.Parse(userType.Value);
                }
                return 0;
            }
        }
        public bool IsAdmin
        {
            get
            {
                var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeEnumInt);
                if (userType != null && !string.IsNullOrEmpty(userType.Value))
                {
                    return int.Parse(userType.Value) == (int)UserTypeEnum.SuperAdmin;
                }
                return false;
            }
        }
        public bool IsZhiZhun
        {
            get
            {
                var isZhizhunClaime = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.IsZhiZhun);
                if (isZhizhunClaime != null && !string.IsNullOrEmpty(isZhizhunClaime.Value))
                {
                    return bool.Parse(isZhizhunClaime.Value);
                }
                return false;
            }
        }
        public bool  IsTestUser
        {
            get
            {
                var isTestUserClaime = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.IsTestUser);
                if (isTestUserClaime != null && !string.IsNullOrEmpty(isTestUserClaime.Value))
                {
                    return bool.Parse(isTestUserClaime.Value);
                }
                return false;
            }
        }
        public string UserToken
        {
            get
            {
                var authorizationHeader = _accessor?.HttpContext?.Request.Headers["Authorization"].ToString();
                if (!string.IsNullOrWhiteSpace(authorizationHeader))
                {
                    return authorizationHeader.Substring(7);
                }
                var token = _accessor?.HttpContext?.Request.Query["access_token"].ToString();
                if (!string.IsNullOrWhiteSpace(token))
                {
                    return token;
                }
                return string.Empty;
            }
        }
        public string PermissionStr
        {
            get
            {
                var permissionStr = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.PermissionStr);
                if (permissionStr != null && !string.IsNullOrEmpty(permissionStr.Value))
                {
                    return permissionStr.Value;
                }
                return string.Empty;
            }
        }
        public string IP
        {
            get
            {
                return _accessor?.HttpContext.GetClientIP();
            }
        }
        public string LocalIp
        {
            get
            {
                return _accessor?.HttpContext?.Connection.LocalIpAddress.MapToIPv4().ToString();
            }
        }
        public bool IsEn_Us
        {
            get
            {
                var lan = _accessor?.HttpContext?.Request?.Headers["Accept-Language"];
                if (lan is not null && !string.IsNullOrEmpty(lan.Value))
                {
                    return lan.Value == "en-US,en;q=0.5".ToString();
                }
                return true;
            }
        }
        public string RequestUrl
        {
            get
            {
                var url = _accessor?.HttpContext?.Request?.Path.ToString();
                var list = url.Split('/').Where(t => !string.IsNullOrWhiteSpace(t)).ToList();
                if (url.Contains("Inspection", StringComparison.OrdinalIgnoreCase))
                {
                    list.RemoveAt(0);
                    return string.Join('/', list.Take(2));
                }
                else
                {
                    return string.Join('/', list.Take(2));
                }
            }
        }
        public string TimeZoneId
        {
            get
            {
                var timeZoneId = _accessor?.HttpContext?.Request?.Headers["TimeZoneId"];
                if (timeZoneId is not null && !string.IsNullOrEmpty(timeZoneId.Value))
                {
                    return timeZoneId.Value;
                }
                //return "Etc/UTC";
                return "Asia/Shanghai";
            }
        }
        public Guid? SignId
        {
            get; set;
        }
        public Guid? BatchId
        {
            get; set;
        }
        /// 
        /// 是否不需要记录稽查
        /// 
        public bool IsNotNeedInspection { get; set; } = false;
    }
    public static class ClaimAttributes
    {
        /// 
        /// 用户Id
        /// 
        public const string UserId = "id";
        public const string UserTypeId = "userTypeId";
        /// 
        /// 用户名
        /// 
        public const string UserName = "name";
        /// 
        /// 姓名
        /// 
        public const string RealName = "realName";
        public const string ReviewerCode = "reviewerCode";
        public const string UserType = "userTypeShortName";
    }
    public struct JwtIRaCISClaimType
    {
        public const string IdentityUserId = "identityUserId";
        public const string UserRoleId = "userRoleId";
        public const string Code = "code";
        public const string UserName = "name";
        public const string FullName = "fullName";
        public const string UserTypeId = "userTypeId";
        public const string UserTypeEnum = "userTypeEnum";
        public const string UserTypeEnumName = "userTypeEnumName";
        public const string UserTypeEnumInt = "userTypeEnumInt";
        public const string UserTypeShortName = "userTypeShortName";
        public const string IsTestUser = "isTestUser";
        public const string IsZhiZhun = "isZhiZhun";
        public const string PermissionStr = "permissionStr";
    }
    public static class HttpContextExtension
    {
        public static string GetClientIP(this HttpContext context)
        {
            //scp 服务创建的记录不能获取请求上下文
            if (context != null)
            {
                var ip = context.Request.Headers["Cdn-Src-Ip"].FirstOrDefault();
                if (!string.IsNullOrEmpty(ip))
                    return IpReplace(ip);
                ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
                if (!string.IsNullOrEmpty(ip))
                    return IpReplace(ip);
                ip = context.Connection.RemoteIpAddress.ToString();
                return IpReplace(ip);
            }
            else
            {
                return string.Empty;
            }
        }
        static string IpReplace(string inip)
        {
            //::ffff:
            //::ffff:192.168.2.131 这种IP处理
            if (inip.Contains("::ffff:"))
            {
                inip = inip.Replace("::ffff:", "");
            }
            return inip;
        }
    }
}