using SqlSugar;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_ISystemRepository;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_Model;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_SystemServices
{
    public class Sys_MenuService : ServiceBase<Sys_Menu, ISys_MenuRepository>, ISys_MenuService
    {
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public Sys_MenuService(ISys_MenuRepository BaseDal, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
        }
        /// <summary>
        /// 获å–当å‰ç”¨æˆ·æ‰€æœ‰èœå•与æƒé™
        /// </summary>
        /// <returns></returns>
        public object GetCurrentMenuActionList()
        {
            object obj = GetMenuActionList(App.User.RoleId);
            if (obj is IEnumerable<object> list)
            {
                if (list.Any())
                {
                    return obj;
                }
                else
                {
                    return WebResponseContent.Instance.Error("未获å–到èœå•ä¿¡æ¯");
                }
            }
            return obj;
        }
        /// <summary>
        /// æ ¹æ®è§’色ID获å–èœå•与æƒé™
        /// </summary>
        /// <param name="roleId"></param>
        /// <returns></returns>
        public object GetMenuActionList(int roleId)
        {
            if (App.User.IsRoleIdSuperAdmin(roleId))
            {
                return BaseDal.GetSuperAdminMenu();
            }
            return BaseDal.GetMenuByRoleId(roleId);
        }
        public List<Sys_Menu> GetUserMenuList(int roleId)
        {
            if (App.User.IsRoleIdSuperAdmin(roleId))
            {
                return BaseDal.GetAllMenu();
            }
            List<int> menuIds = BaseDal.GetPermissions(roleId).Select(x => x.MenuId).ToList();
            return BaseDal.GetAllMenu().Where(x => menuIds.Contains(x.MenuId)).ToList();
        }
        public List<Sys_Actions> GetActions(int menuId, List<Sys_Actions> menuActions, List<Permissions> permissions, int roleId)
        {
            if (App.User.IsRoleIdSuperAdmin(roleId))
            {
                return menuActions;
            }
            return menuActions.Where(p => permissions
                 .Exists(w => menuId == w.MenuId
                 && w.UserAuthArr.Contains(p.Value)))
                  .ToList();
        }
        /// <summary>
        /// 编辑修改èœå•æ—¶,èŽ·å–æ‰€æœ‰èœå•
        /// </summary>
        /// <returns></returns>
        public object GetMenu()
        {
            if (App.User.IsRoleIdSuperAdmin(App.User.RoleId))
            {
                List<int> menuIds = BaseDal.QueryData().Select(x => x.MenuId).ToList();
                return BaseDal.GetMenu(menuIds);
            }
            else
            {
                List<int> menuIds = BaseDal.GetPermissions(App.User.RoleId).Select(x => x.MenuId).ToList();
                return BaseDal.GetMenu(menuIds);
            }
        }
        /// <summary>
        /// 编辑èœå•时,获å–èœå•ä¿¡æ¯
        /// </summary>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public object GetTreeItem(int menuId)
        {
            return BaseDal.GetTreeItem(menuId);
        }
        /// <summary>
        /// 新建或编辑èœå•
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public WebResponseContent Save(Sys_Menu menu)
        {
            WebResponseContent webResponse = new WebResponseContent();
            if (menu == null) return webResponse.Error("没有获å–到æäº¤çš„傿•°");
            if (menu.MenuId > 0 && menu.MenuId == menu.ParentId) return webResponse.Error("父级IDä¸èƒ½æ˜¯å½“å‰èœå•çš„ID");
            try
            {
                //webResponse = menu.ValidationEntity(x => new { x.MenuName, x.TableName });
                //if (!webResponse.Status) return webResponse;
                if (menu.TableName != "/" && menu.TableName != ".")
                {
                    // 2022.03.26增移动端加èœå•类型判æ–
                    Sys_Menu sysMenu = BaseDal.QueryFirst(x => x.TableName == menu.TableName);
                    if (sysMenu != null)
                    {
                        sysMenu.MenuType ??= 0;
                        if (sysMenu.MenuType == menu.MenuType)
                        {
                            if ((menu.MenuId > 0 && sysMenu.MenuId != menu.MenuId)
                            || menu.MenuId <= 0)
                            {
                                return webResponse.Error($"视图/表åã€{menu.TableName}】已被其他èœå•使用");
                            }
                        }
                    }
                }
                bool _changed = false;
                if (menu.MenuId <= 0)
                {
                    int id = BaseDal.AddData(menu);
                    menu.MenuId = id;
                }
                else
                {
                    //2020.05.07æ–°å¢žç¦æ¢é€‰æ‹©ä¸Šçº§è§’色为自己
                    if (menu.MenuId == menu.ParentId)
                    {
                        return webResponse.Error($"父级idä¸èƒ½ä¸ºè‡ªå·±");
                    } 
                    if (BaseDal.QueryFirst(x => x.ParentId == menu.MenuId && menu.ParentId == x.MenuId) != null)
                    {
                        return webResponse.Error($"ä¸èƒ½é€‰æ‹©æ¤çˆ¶çº§id,选择的父级id与当å‰èœå•å½¢æˆä¾èµ–关系");
                    }
                    _changed = BaseDal.QueryData(c => c.MenuId == menu.MenuId).Select(s => s.Auth).FirstOrDefault() != menu.Auth;
                    BaseDal.UpdateData(menu);
                }
                webResponse.OK("ä¿å˜æˆåŠŸ", menu);
            }
            catch (Exception ex)
            {
                webResponse.Error(ex.Message);
            }
            return webResponse;
        }
        public WebResponseContent DelMenu(int menuId)
        {
            WebResponseContent webResponse = new WebResponseContent();
            if(BaseDal.QueryFirst(x=>x.ParentId == menuId) != null)
            {
                return webResponse = WebResponseContent.Instance.Error("当å‰èœå•å˜åœ¨åèœå•,请先删除åèœå•!");
            }
            BaseDal.DeleteDataById(menuId);
            return webResponse = WebResponseContent.Instance.OK("删除æˆåŠŸ");
        }
    }
}