using Model.ModelVm.SysVm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using WMS.Entity.Context;
using WMS.Entity.SysEntity;
using WMS.IDAL.ISysInterface;
using SQLitePCL;
using Model.ModelDto.SysDto;
using Dm;
using System.Security.Cryptography;
using System.Security.Policy;
using System.Linq;

namespace WMS.DAL.SysInfrastructure
{
    /// <summary>
    /// 菜单仓储实践
    /// </summary>
    public class MenuRepository : BaseRepository<SysFunctionMenu>, IMenuRepository
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public MenuRepository() : base(Db)
        {
        }

        /// <summary>
        /// 获取菜单信息列表
        /// </summary>
        /// <param name="str">sql语句</param>
        /// <returns></returns>
        public List<FunctionMenuVm> GetMenuList(string str = "")
        {
            List<FunctionMenuVm> menulist = Db.Ado.SqlQuery<FunctionMenuVm>(str);
            return menulist;
        }

        /// <summary>
        /// 获取模块菜单列表
        /// </summary>
        /// <returns></returns>
        public List<SysFunctionMenu> GetParentMenuList()
        {
            string str = "select MenuNo,ParentNo,MenuName from SysFunctionMenu where IsDel = @isdel and IsEnable = @isenable";
            List<SysFunctionMenu> menulist = Db.Ado.SqlQuery<SysFunctionMenu>(str, new
            {
                isdel = "0", //是否删除
                isenable = "0" //是否可用
            });
            return menulist;
        }

        /// <summary>
        /// 获取菜单信息列表
        /// </summary>
        /// <param name="str">sql语句</param>
        /// <returns></returns>
        public List<FunctionMenuDto> GetMenuDtoList(string MenuNo, string UserId)
        {
            var userEntry = Db.Ado.SqlQuery<SysUserInfor>($"select * from SysUserInfor where Id ={UserId}").FirstOrDefault();
            //获取全部菜单信息
            string strmenu = "select * from SysFunctionMenu where IsDel = '0'";
            //判断菜单号
            if (!string.IsNullOrEmpty(MenuNo))
            {
                strmenu += $" and ParentNo in ({MenuNo})";
            }
            //分配权限只能分配当前登录用户有的权限
            if (userEntry !=null && userEntry.UserName.ToUpper() != "ADMIN")
            {
                strmenu += $" and MenuNo in (select MenuNo from SysRoleRight where RoleNo='{userEntry.RoleNo}')";
            }
            strmenu += "  order by Ord asc";
            List<FunctionMenuDto> menulist = Db.Ado.SqlQuery<FunctionMenuDto>(strmenu);
            return menulist;
        }

        /// <summary>
        /// 根据id获取菜单信息列表
        /// </summary>
        /// <param name="menuid">菜单id</param>
        /// <returns></returns>
        public SysFunctionMenu GetMenuListById(int menuid)
        {
            string str = "select * from SysFunctionMenu where IsDel = @isdel and Id = @id and IsEnable = @isenable ";
            SysFunctionMenu menulist = Db.Ado.SqlQuerySingle<SysFunctionMenu>(str, new
            {
                isdel = "0", //是否删除
                isenable = "0", //是否公开
                id = menuid //id
            });
            return menulist;
        }

        /// <summary>
        ///  根据编号获取菜单信息列表
        /// </summary>
        /// <param name="str">sql</param>
        /// <returns></returns>
        public List<SysFunctionMenu> GetMenuListByNo(string str)
        {
            List<SysFunctionMenu> menulist = Db.Ado.SqlQuery<SysFunctionMenu>(str);
            return menulist;
        }

        /// <summary>
        /// 新增菜单信息
        /// </summary>
        /// <param name="menu">菜单实体模型</param>
        /// <returns></returns>
        public async Task<int> InsertMenu(SysFunctionMenu menu)
        {
            string str = "insert SysFunctionMenu values(@menuno, @menuname, @parentno, @ord, @url, @level, @isenable, @demo, @isdel, @createtime, @createuser, null, null)";
            int i = await Db.Ado.ExecuteCommandAsync(str, new
            {
                menuno = menu.MenuNo, //菜单号
                menuname = menu.MenuName, //菜单名称
                parentno = menu.ParentNo, //父级菜单号
                ord = menu.Ord, //显示顺序
                url = menu.Url, //路径
                level = menu.Level, //层级
                isenable = "0", //是否可用
                demo = menu.Demo, //备注
                isdel = "0", //是否删除
                createtime = Db.GetDate(), //创建时间
                createuser = menu.CreateUser //创建人
            });
            return i;
        }

        /// <summary>
        /// 删除菜单信息
        /// </summary>
        /// <param name="menu">菜单实体模型</param>
        /// <returns></returns>
        public async Task<int> DeleteMenu(SysFunctionMenu menu)
        {
            try
            {
                Db.BeginTran();
                string str = "update SysFunctionMenu set IsDel = @isdel, UpdateTime = @updatetime, UpdateUser = @updateuser where MenuNo in (select MenuNo from SysFunctionMenu where MenuNo = @menuno or ParentNo = @menuno or ParentNo in (select MenuNo from SysFunctionMenu where ParentNo = @menuno));";
                int i = await Db.Ado.ExecuteCommandAsync(str, new
                {
                    isdel = "1", //是否删除
                    updatetime = Db.GetDate(), //更改时间
                    updateuser = menu.UpdateUser, //更改人
                    menuno = menu.MenuNo//id
                });
                str = "delete from SysRoleRight where MenuNo in (select MenuNo from SysFunctionMenu where MenuNo = @menuno or ParentNo = @menuno or ParentNo in (select MenuNo from SysFunctionMenu where ParentNo = @menuno));";
                //删除菜单对应的权限
                i = await Db.Ado.ExecuteCommandAsync(str, new
                {
                    isdel = "1", //是否删除
                    updatetime = Db.GetDate(), //更改时间
                    updateuser = menu.UpdateUser, //更改人
                    menuno = menu.MenuNo
                });
                Db.CommitTran();
                return i;
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw ex;
            }
        }

        /// <summary>
        /// 编辑菜单信息
        /// </summary>
        /// <param name="menu">菜单实体模型</param>
        /// <returns></returns>
        public async Task<int> UpdateMenu(SysFunctionMenu menu)
        {
            string str = "Update SysFunctionMenu set  MenuName = @menuname, ParentNo = @parentno, Ord = @ord, Url = @url, Level = @level, IsEnable = @isenable, Demo = @demo, UpdateTime = @updatetime, UpdateUser = @updateuser where Id = @id";

            int i = await Db.Ado.ExecuteCommandAsync(str, new
            {
                menuname = menu.MenuName, //菜单名称
                parentno = menu.ParentNo, //父级菜单号
                ord = menu.Ord, //显示顺序
                url = menu.Url, //路径
                level = menu.Level, //层级
                isenable = "0", //是否可用
                demo = menu.Demo, //备注
                updatetime = Db.GetDate(), //创建时间
                updateuser = menu.UpdateUser, //创建人
                id = menu.Id //id
            });
            return i;
        }

        /// <summary>
        /// 根据父级菜单号获取菜单信息
        /// </summary>
        /// <param name="MenuNo">菜单号</param>
        /// <returns></returns>
        public List<FunctionMenuVm> GetMenuByParentNo(string MenuNo)
        {
            string str = "select * from SysFunctionMenu where IsDel = @isdel and IsEnable = @isenable ";
            List<FunctionMenuVm> menulist;
            //判断菜单号是否为空
            if (!string.IsNullOrEmpty(MenuNo))
            {
                str += " and ParentNo = @menuno";
                menulist = Db.Ado.SqlQuery<FunctionMenuVm>(str, new
                {
                    isdel = "0", //是否删除
                    isenable = "0", //是否公开
                    menuno = MenuNo //菜单号
                });
            }
            else
            {
                str = "select * from SysFunctionMenu where IsDel = '3' and IsEnable = '0'";
                menulist = Db.Ado.SqlQuery<FunctionMenuVm>(str);
            }

            return menulist;
        }
    }
}