using FactorySystemCommon;
using FactorySystemModel.SqlSugarModel;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using FactorySystemModel.EnumModel;
namespace FactorySystemBll
{
    public class UserBll
    {
        /// 
        /// 获取配置信息
        /// 
        public object GetBasicList(int type)
        {
            return AppSettingsHelper.GetSqlSugar().Queryable().Where(s => s.FType == type && s.FState == 1).ToList();
        }
        /// 
        /// 获取角色集合
        /// 
        /// 
        public object GetRoleList()
        {
            return AppSettingsHelper.GetSqlSugar().Queryable().Where(s => s.FDeleted != (int)Constant.DeleteCode.已删除).ToList();
        }
        /// 
        /// 获取权限配置集合
        /// 
        /// 
        /// 
        public List GetPower(string userid) 
        {
            return AppSettingsHelper.GetSqlSugar().Queryable().Where("FUserID="+ userid).ToList();
        }
        /// 
        /// 获取菜单权限
        /// 
        public object GetMenuList(int userId, string roleIds, bool returnAll = false)
        {
            int delete = (int)Constant.DeleteCode.已删除;
            SqlSugarClient db = AppSettingsHelper.GetSqlSugar();
            List roles = new List();
            if (string.IsNullOrEmpty(roleIds))
            {
                TUser userInfo = db.Queryable().Where(s => s.FID == userId && s.FDeleted != delete).First();
                roleIds = userInfo.FRoleID.ToString();
            }
            roles = roleIds.Split(',').ToList();
            List menuList = db.Queryable().Where(s => s.FDeleted != delete).ToList();
            List hasIds = db.Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.FID == b.FRoleID))
                  .Where((a, b) => a.FDeleted != delete && b.FType == (int)Constant.RoleType.菜单权限 && roles.Contains(a.FID.ToString()))
                  .Select((a, b) => b.FFunctionID).GroupBy("b.FFunctionID").ToList();
            if (returnAll)
            {
                return menuList.Select(s => new
                {
                    s.FID,
                    s.FIcon,
                    s.FParentID,
                    s.FName,
                    s.FLevel,
                    s.FLocation,
                    s.FOrder,
                    s.FRemark,
                    FIsChose = hasIds.IndexOf(s.FID) != -1
                }).ToList();
            }
            else
            {
                return menuList.Where(s => hasIds.IndexOf(s.FID) != -1).Select(s => new
                {
                    s.FID,
                    s.FIcon,
                    s.FParentID,
                    s.FName,
                    s.FLevel,
                    s.FLocation,
                    s.FOrder,
                    s.FRemark,
                }).ToList();
            }
        }
        /// 
        /// 获取其他权限
        /// 
        public object GetBasicRoleList(object roleIds, int roleType, string viewType, int userId, bool returnAll)
        {
            int roleType2 = -1;
            if (roleType == 36) roleType2 = (int)Constant.RoleType.事项权限;
            else if (roleType == 39) roleType2 = (int)Constant.RoleType.视图权限;
            else if (roleType == 40) roleType2 = (int)Constant.RoleType.物料视图编辑;
            else if (roleType == 44) roleType2 = (int)Constant.RoleType.物料基础编辑;
            // 20230328 新增
            // 前端新增传84,用于合并40和44
            else if (roleType == 84) roleType2 = (int)Constant.RoleType.视图编辑;
            if (roleType2 <= 0) return null;
            SqlSugarClient db = AppSettingsHelper.GetSqlSugar();
            List roles = new List();
            if (null == roleIds || string.IsNullOrEmpty(roleIds.ToString()))
            {
                TUser userInfo = db.Queryable().Where(s => s.FID == userId && s.FDeleted != (int)Constant.DeleteCode.已删除).First();
                roleIds = userInfo.FRoleID;
            }
            roles = roleIds.ToString().Trim(',').Split(',').ToList();
            /**
             * 20230328
             * 合并物料视图和基础视图
             * 前端只保留
             * 当roleType == 84时,分别取TBasicCode中的FType = 40和44两个类型的数据(即物料视图和基础视图的所有字段数据)
             * 当roleType == 84时,分别取TRole_Right中的FType = 4和5两个类型的数据(即物料视图和基础视图的所有权限数据)
             * **/
            List resultList = null;
            List hasIds = null;
            dynamic result = null;
            if (roleType == 84)
            {
                resultList = db.Queryable().Where(s => (s.FType == 44 && s.FState == 1)).OrderBy(s => s.FOrder).ToList();
                hasIds = db.Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.FID == b.FRoleID))
                    .Where((a, b) => a.FDeleted != (int)Constant.DeleteCode.已删除 && b.FType == 5 && roles.Contains(a.FID.ToString()))
                    .Select((a, b) => b.FFunctionID).ToList();
                if (!string.IsNullOrEmpty(viewType)) resultList = resultList.Where(s => s.F1.Equals(viewType)).ToList();
                if (returnAll)
                {
                    result = resultList.Select(s => new
                    {
                        s.FID,
                        s.FType,
                        s.FCode,
                        s.FName,
                        s.FRemark,
                        FIsChose = hasIds.IndexOf(int.Parse(s.FCode)) != -1,
                        s.F1,
                        s.F2
                    }).OrderBy(s => int.Parse(s.FCode)).ToList();
                }
                else
                {
                    result = resultList.Where(s => hasIds.IndexOf(int.Parse(s.FCode)) != -1).Select(s => new
                    {
                        s.FID,
                        s.FType,
                        s.FCode,
                        s.FName,
                        s.FRemark,
                        s.F1,
                        s.F2
                    }).OrderBy(s => int.Parse(s.FCode)).ToList();
                }
                resultList = db.Queryable().Where(s => (s.FType == 40 && s.FState == 1)).OrderBy(s => s.FOrder).ToList();
                hasIds = db.Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.FID == b.FRoleID))
                    .Where((a, b) => a.FDeleted != (int)Constant.DeleteCode.已删除 && b.FType == 4 && roles.Contains(a.FID.ToString()))
                    .Select((a, b) => b.FFunctionID).ToList();
                if (!string.IsNullOrEmpty(viewType)) resultList = resultList.Where(s => s.F1.Equals(viewType)).ToList();
                if (returnAll)
                {
                    result.AddRange(
                        resultList.Select(s => new
                        {
                            s.FID,
                            s.FType,
                            s.FCode,
                            s.FName,
                            s.FRemark,
                            FIsChose = hasIds.IndexOf(int.Parse(s.FCode)) != -1,
                            s.F1,
                            s.F2
                        }).OrderBy(s => int.Parse(s.FCode)).ToList()
                    );
                }
                else
                {
                    result.AddRange(
                        resultList.Where(s => hasIds.IndexOf(int.Parse(s.FCode)) != -1).Select(s => new
                        {
                            s.FID,
                            s.FType,
                            s.FCode,
                            s.FName,
                            s.FRemark,
                            s.F1,
                            s.F2
                        }).OrderBy(s => int.Parse(s.FCode)).ToList()
                    );
                }
            }
            else
            {
                resultList = db.Queryable().Where(s => s.FType == roleType && s.FState == 1).OrderBy(s => s.FOrder).ToList();
                hasIds = db.Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.FID == b.FRoleID))
                    .Where((a, b) => a.FDeleted != (int)Constant.DeleteCode.已删除 && b.FType == roleType2 && roles.Contains(a.FID.ToString()))
                    .Select((a, b) => b.FFunctionID).ToList();
                if (!string.IsNullOrEmpty(viewType)) resultList = resultList.Where(s => s.F1.Equals(viewType)).ToList();
                if (returnAll)
                {
                    result = resultList.Select(s => new
                    {
                        s.FID,
                        s.FCode,
                        s.FName,
                        s.FRemark,
                        FIsChose = hasIds.IndexOf(int.Parse(s.FCode)) != -1,
                        s.F1,
                        s.F2
                    }).OrderBy(s => int.Parse(s.FCode)).ToList();
                }
                else
                {
                    result = resultList.Where(s => hasIds.IndexOf(int.Parse(s.FCode)) != -1).Select(s => new
                    {
                        s.FID,
                        s.FCode,
                        s.FName,
                        s.FRemark,
                        s.F1,
                        s.F2
                    }).OrderBy(s => int.Parse(s.FCode)).ToList();
                }
            }
            return result;
            // 20230328 需求修改注释
            // List resultList = db.Queryable().Where(s => s.FType == roleType && s.FState == 1).OrderBy(s => s.FOrder).ToList();
            // List hasIds = db.Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.FID == b.FRoleID))
            //    .Where((a, b) => a.FDeleted != (int)Constant.DeleteCode.已删除 && b.FType == roleType2 && roles.Contains(a.FID.ToString()))
            //    .Select((a, b) => b.FFunctionID).ToList();
            //视图类型
            //if (!string.IsNullOrEmpty(viewType)) resultList = resultList.Where(s => s.F1.Equals(viewType)).ToList();
            //if (returnAll)
            //{
            //    var a = resultList.Select(s => new
            //    {
            //        s.FID,
            //        s.FCode,
            //        s.FName,
            //        s.FRemark,
            //        FIsChose = hasIds.IndexOf(int.Parse(s.FCode)) != -1,
            //        s.F1,
            //        s.F2
            //    }).OrderBy(s => int.Parse(s.FCode)).ToList();
            //    return a;
            //}
            //else
            //{
            //    return resultList.Where(s => hasIds.IndexOf(int.Parse(s.FCode)) != -1).Select(s => new
            //    {
            //        s.FID,
            //        s.FCode,
            //        s.FName,
            //        s.FRemark,
            //        s.F1,
            //        s.F2
            //    }).OrderBy(s => int.Parse(s.FCode)).ToList();
            //}
        }
        /// 
        /// 保存菜单集合
        /// 
        public int SaveRolePower(string userId, int roleId, List menuIds, List viewIds, List termIds, List editIds, List editIds2)
        {
            int result = 1;
            SqlSugarClient db = AppSettingsHelper.GetSqlSugar();
            db.BeginTran();
            try
            {
                if (menuIds != null)
                {
                    result += db.Deleteable().Where(s => s.FRoleID == roleId && s.FType == (int)Constant.RoleType.菜单权限
                    && !menuIds.Contains(s.FFunctionID.ToString())).ExecuteCommand();
                }
                if (viewIds != null)
                {
                    result += db.Deleteable().Where(s => s.FRoleID == roleId && s.FType == (int)Constant.RoleType.视图权限
                    && !viewIds.Contains(s.FFunctionID.ToString())).ExecuteCommand();
                }
                if (termIds != null)
                {
                    result += db.Deleteable().Where(s => s.FRoleID == roleId && s.FType == (int)Constant.RoleType.事项权限
                    && !termIds.Contains(s.FFunctionID.ToString())).ExecuteCommand();
                }
                if (editIds != null)
                {
                    result += db.Deleteable().Where(s => s.FRoleID == roleId && s.FType == (int)Constant.RoleType.物料视图编辑
                    && !editIds.Contains(s.FFunctionID.ToString())).ExecuteCommand();
                }
                if (editIds2 != null)
                {
                    result += db.Deleteable().Where(s => s.FRoleID == roleId && s.FType == (int)Constant.RoleType.物料基础编辑
                    && !editIds.Contains(s.FFunctionID.ToString())).ExecuteCommand();
                }
                List inList = new List();
                List hasRoles = db.Queryable().Where(s => s.FRoleID == roleId).ToList();
                if (menuIds != null)
                {
                    inList.AddRange(CheckPowerIds(hasRoles, menuIds, (int)Constant.RoleType.菜单权限, userId, roleId));
                }
                if (viewIds != null)
                {
                    inList.AddRange(CheckPowerIds(hasRoles, viewIds, (int)Constant.RoleType.视图权限, userId, roleId));
                }
                if (termIds != null)
                {
                    inList.AddRange(CheckPowerIds(hasRoles, termIds, (int)Constant.RoleType.事项权限, userId, roleId));
                }
                if (editIds != null)
                {
                    inList.AddRange(CheckPowerIds(hasRoles, editIds, (int)Constant.RoleType.物料视图编辑, userId, roleId));
                }
                if (editIds2 != null)
                {
                    inList.AddRange(CheckPowerIds(hasRoles, editIds2, (int)Constant.RoleType.物料基础编辑, userId, roleId));
                }
                if (inList.Count() > 0) result += db.Insertable(inList).ExecuteCommand();
                db.CommitTran();
            }
            catch (Exception)
            {
                db.RollbackTran();
            }
            return result;
        }
        public int CreateFPower(List list) 
        {
            int result = 0;
            if (list.Count() > 0) 
            {
                SqlSugarClient db = AppSettingsHelper.GetSqlSugar();
                FPower power = list.LastOrDefault();
                db.Deleteable().Where(s => s.FUserID == power.FUserID).ExecuteCommand();
                result = db.Insertable(list).ExecuteCommand();
            }
            return result;
        }
        public List GetFPowerList()
        {
            return AppSettingsHelper.GetSqlSugar().Queryable().ToList();
        }
        /// 
        /// 获取首页信息
        /// 
        public object GetHomeTopCount(int userId)
        {
            SqlSugarClient db = AppSettingsHelper.GetSqlSugar();
            List topCount = new List();
            topCount.Add(db.Queryable().Where(s => s.FState < 2).Where(string.Format("','+FUserID+',' like '%,{0},%'", userId)).Count());
            topCount.Add(db.Queryable().Where(string.Format("','+FUserID+',' like '%,{0},%'", userId))
                .Where(string.Format("convert(varchar(10),FAddDate,23)='{0}'", DateTime.Now.ToString("yyyy-MM-dd"))).Count());
            topCount.Add(db.Queryable().Count());
            topCount.Add(db.Queryable().Where(string.Format(@"FID in(select distinct FTeamID from TFS_FTeamProcess 
            where ','+FChargeID+',' like '%,{0},%' union select distinct FTeamID from TFS_Task where ','+FUserID+',' like '%,{0},%')",
            userId)).Count());
            return topCount;
        }
        #region 内部方法
        private List CheckPowerIds(List hasRoles, List inIds, int roleType, string userId, int roleId)
        {
            List ids = hasRoles.Where(ss => ss.FType == roleType).Select(sss => sss.FFunctionID).ToList();
            if (ids.Count() > 0) inIds = inIds.Where(s => !ids.Contains(int.Parse(s))).ToList();
            if (inIds.Count() > 0)
            {
                return inIds.Select(s => new TRole_Right()
                {
                    FFunctionID = int.Parse(s),
                    FOperate = userId,
                    FType = roleType,
                    FRoleID = roleId,
                }).ToList();
            }
            return new List();
        }
        #endregion
    }
}