using OASystem.Domain;
using OASystem.Domain.Entities.System;
using OASystem.Domain.ViewModels.System;
using System.Collections;

namespace OASystem.Infrastructure.Repositories.System
{
    public class SystemMenuPermissionRepository : BaseRepository<Sys_SystemMenuPermission, SystemMenuPermissionView>
    {
        public SystemMenuPermissionRepository(SqlSugarClient sqlSugar) : base(sqlSugar)
        {

        }

        /// <summary>
        /// 分页查询页面表
        /// </summary>
        /// <param name="_SystemMenuPermissionRepository"></param>
        /// <param name="mid">模块id</param>
        /// <param name="pageSize">行数</param>
        /// <param name="currentPage">页码</param>
        /// <returns></returns>
        public Result GetSystemMenuViweData(SystemMenuPermissionRepository _SystemMenuPermissionRepository,int mid,int pageSize,int currentPage)
        {
            Result result = new Result();
            if (currentPage == 0 || pageSize == 0)
            {
                return result;
            }

            string sql = $@"select top {pageSize} * from (select row_number() 
                        over(order by id asc) as rownumber,*    
                        from Sys_SystemMenuPermission where mid = {mid} and isdel = 0 and IsEnable = 1 ) temp_row
                        where rownumber> {(currentPage - 1) * pageSize};";

            var DBdata = _SystemMenuPermissionRepository.GetListBySqlWithNolock(sql);

            if (DBdata == null || DBdata.Count == 0)
            {
                result.Code = -1;
                result.Msg = "暂无数据！";
                result.Data = new
                {
                    DBdata,
                    total = 0
                };
                return result;
            }

            var total = _SystemMenuPermissionRepository.Query<Sys_SystemMenuPermission>(x => x.Mid == mid).Count();

            result.Code = 0;
            result.Msg = "成功！";
            result.Data = new
            {
                DBdata = DBdata.Select(x => new SystemMenuPermissionView
                {
                    Id = x.Id,
                    Name = x.Name,
                    Mid = mid,
                    SystemMenuCode = x.SystemMenuCode
                }),
                total = total
            };
            return result;
        }


        public Result QueryMenuLoad(int uid,int PortType)
        {
            Result result = new Result();

            if (uid != 0)
            {
                List<MenuLoadView> DBData = new List<MenuLoadView>();
                string sql = $@"
                     select a.UId,a.SmId,b.Id as Funid,b.FunctionName,b.FunctionCode,c.Id as modulid,
                      c.Name as modulName,c.STid,d.Id as pageid ,d.Name as PageName,d.SystemMenuCode,d.webUrl,d.AndroidUrl,d.icon,
                      d.IosUrl
                      from Sys_UserAuthority a inner join Sys_PageFunctionPermission b on a.FId = b.Id 
                      inner join Sys_SystemMenuPermission d on a.SmId = d.Id inner join Sys_SetData c on c.Id = d.Mid
                      where uid = {uid} and a.IsDel= 0  and b.IsDel = 0 
                      and b.IsEnable = 1 and c.IsDel = 0 and d.IsDel = 0   ";

                if (PortType == 1)
                {
                    sql += $@" and b.Id = 1 and d.IsEnable = 1  group by 
                      a.UId,a.SmId,b.Id,b.FunctionName,b.FunctionCode,c.Id,
                      c.Name,c.STid,d.Id,d.Name,d.SystemMenuCode,d.webUrl,d.AndroidUrl,d.icon,
                      d.IosUrl";
                    DBData = _sqlSugar.SqlQueryable<MenuLoadView>(sql).ToList();
                }
                else if (PortType == 2)
                {
                    sql += $@" and d.phoneIsEnable = 1 group by 
                      a.UId,a.SmId,b.Id,b.FunctionName,b.FunctionCode,c.Id,
                      c.Name,c.STid,d.Id,d.Name,d.SystemMenuCode,d.webUrl,d.AndroidUrl,d.icon,
                      d.IosUrl ";
                    DBData = _sqlSugar.SqlQueryable<MenuLoadView>(sql).ToList();
                }

                result.Code = -1;
                result.Msg = "暂无数据！";

                if (DBData.Count > 0)
                {
                    result.Code = 0;
                    result.Msg = "成功！";
                    var arr = new ArrayList();

                    if (PortType == 1)
                    {
                        var menuGroup = DBData.GroupBy(x => x.modulid);
                        foreach (var item in menuGroup)
                        {
                            var modul = item.FirstOrDefault();
                            if (modul != null)
                            {
                                if (modul.modulName.Contains("主页"))
                                {
                                    arr.Insert(0, new
                                    {
                                        modulName = modul.modulName,
                                        modulid = modul.modulid,
                                        pageList = item
                                    });
                                }
                                else
                                {
                                    arr.Add(new
                                    {
                                        modulName = modul.modulName,
                                        modulid = modul.modulid,
                                        pageList = item
                                    });
                                }
                            }
                        }

                    }
                    else if (PortType == 2)
                    {
                        var AndMenu = DBData.GroupBy(x => x.SmId).ToList();

                        foreach (var item in AndMenu)
                        {
                            arr.Add(new
                            {
                                pageId = item.Key,
                                opList = item.Select(x=>x.Funid).ToList(),
                            });
                        }           
                    }

                    result.Data = arr;
                }
               
            }
            return result;
        }


    }
}
