using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model.ModelDto.SysDto;
using Model.ModelVm.SysVm;
using SqlSugar;
using WMS.Entity.Context;
using WMS.Entity.SysEntity;
using WMS.IDAL.ISysInterface;
namespace WMS.DAL.SysInfrastructure
{
    /// 
    /// 角色权限仓储实践
    /// 
    public class RoleRightRepository : BaseRepository, IRoleRightRepository
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public RoleRightRepository() : base(Db)
        {
        }
        public List GetRoleMenuList(int userId)
        {
            try
            {
                var user = Db.Queryable().First(m => m.Id == userId && m.IsDel == "0");
                if (user == null)
                {
                    throw new Exception("未查询到登录人信息");
                }
                if (string.IsNullOrWhiteSpace(user.RoleNo))
                {
                    throw new Exception("未查询到登录人的所属角色信息");
                }
                string str = $@"select role.Id RoleId, menu.Id MenuId,roleright.RoleNo,roleright.MenuNo,role.RoleName,
                        menu.MenuName,menu.ParentNo,menu.Ord,menu.Url,menu.level,menu.IsEnable,role.Demo RoleDemo,menu.Demo MenuDemo 
                        from SysRoleRight roleright 
                        join SysFunctionMenu menu on roleright.MenuNo = menu.MenuNo 
                        join SysRoles role on roleright.RoleNo = role.RoleNo
                        where role.IsDel = '0' and menu.IsDel = '0' 
                        and roleright.IsDel = '0' and roleright.RoleNo = '{user.RoleNo}' ";
                var roleRightDtos = Db.Ado.SqlQuery(str);
                return roleRightDtos.OrderBy(m => m.Ord).ToList();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// 
        /// 获取角色权限信息列表
        /// 多表:角色权限、角色、菜单
        /// 
        /// 
        public List GetRoleRightList()
        {
            string str = "select role.Id RoleId,menu.Id MenuId,roleright.RoleNo,roleright.MenuNo,role.RoleName,menu.MenuName,menu.ParentNo,menu.Ord,menu.Url,menu.level,menu.IsEnable,role.Demo RoleDemo,menu.Demo MenuDemo from SysRoleRight roleright join SysFunctionMenu menu on roleright.MenuNo = menu.MenuNo join SysRoles role on roleright.RoleNo = role.RoleNo where role.IsDel = @isdel";
            List roleRightDtos = Db.Ado.SqlQuery(str, new
            {
                isdel = "0", //角色是否删除
            });
            return roleRightDtos;
        }
        /// 
        /// 根据角色id获取当前角色所拥有权限
        /// 
        /// 角色id
        /// 
        public List GetRoleRightListById(int id)
        {
            string str = "select * from SysRoleRight roleright left join SysRoles role on roleright.RoleNo = role.RoleNo left join SysFunctionMenu menu1 on menu1.MenuNo = roleright.MenuNo where role.Id = @id and roleright.IsDel = @isdel";
            List rolerightlist = Db.Ado.SqlQuery(str, new
            {
                isdel = "0", //角色权限是否删除
                id //id
            });
            return rolerightlist;
        }
        /// 
        /// 获取角色权限信息列表(单表)
        /// 
        /// 
        public List GetRoleRightOneListById(int id)
        {
            string str = "select RoleNo,MenuNo from SysRoleRight where Isdel = @isdel and RoleNo = (select RoleNo from SysRoles where IsDel = @roleisdel and Id = @id)";
            List roleRights = Db.Ado.SqlQuery(str, new
            {
                roleisdel = "0", //角色是否删除
                isdel = "0", //角色权限是否删除
                id //id
            });
            return roleRights;
        }
        /// 
        /// 根据角色号获取角色权限信息列表(单表)
        /// 
        /// 角色号
        /// 
        public List GetRoleRightOneListByNo(string RoleNo)
        {
            string str = "select * from SysRoleRight where RoleNo = @roleno";
            List roleRights = Db.Ado.SqlQuery(str, new
            {
                roleno = RoleNo //角色号
            });
            return roleRights;
        }
        /// 
        /// 新增角色权限信息
        /// 
        /// 角色权限实体模型
        /// 
        public async Task InsertRoleRight(SysRoleRight roleright)
        {
            string str = "insert into SysRoleRight values(@roleno, @menuno, @isdel, @createtime, @createuser, null, null)";
            int i = await Db.Ado.ExecuteCommandAsync(str, new
            {
                roleno = roleright.RoleNo, //角色号
                menuno = roleright.MenuNo, //菜单号
                isdel = "0", //是否删除
                createtime = Db.GetDate(), //创建时间
                createuser = roleright.CreateUser //创建人
            });
            return i;
        }
        /// 
        /// 删除角色权限信息
        /// 
        /// 角色号
        /// 
        public async Task DeleteRoleRight(string RoleNo)
        {
            string str = "delete from SysRoleRight where RoleNo = @roleno";
            //删除
            int i = await Db.Ado.ExecuteCommandAsync(str, new
            {
                roleno = RoleNo //角色号
            });
            return i;
        }
        /// 
        /// 删除子级角色权限信息
        /// 
        /// 角色号
        /// 
        public async Task DeleteChildRoleRight(string RoleNo, string MenuNo)
        {
            try
            {
                //将菜单号进行分割 存储数组中
                var arr = MenuNo.Split(',');
                List roleList = Db.Ado.SqlQuery($"select * from SysRoles where CreateUser in (select Id from SysUserInfor where RoleNo='{RoleNo}') ");
                foreach (var item in roleList)
                {
                    List roleRightList = Db.Ado.SqlQuery($"select * from SysRoleRight where RoleNo='{item.RoleNo}'");
                    foreach (var right in roleRightList)
                    {
                        int first1 = Array.IndexOf(arr, right.MenuNo);
                        if (first1 <= -1)
                        {
                            await Db.Ado.ExecuteCommandAsync($"delete from SysRoleRight where RoleNo = '{item.RoleNo}' and MenuNo='{right.MenuNo}' ");
                        }
                    }
                }
                return 1;
            }
            catch(Exception ex)
            {
                throw new Exception("编辑角色权限信息异常", ex);
            }
        }
        /// 
        /// 分配权限显示
        /// 
        /// 
        /// 
        public List GetRoleRightRBAC(string str)
        {
            List rolerightdto = Db.Ado.SqlQuery(str);
            return rolerightdto;
        }
    }
}