using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IRepository;
using Admin.Core.IService;
using Admin.Core.IService.ISys;
using Admin.Core.Model;
using Admin.Core.Model.Sys;
using SqlSugar;

namespace Admin.Core.Service
{
    /// <summary>
    /// 部门表Service
    /// </summary>	
    public partial class SysPermissionService : BaseServices<UserPermission>, ISysPermissionService
    {
        IBaseRepository<UserPermission> dal;
        ISysRoleService roleService;
        ISysMenuService menuService;
        ISysUserRoleService userRoleService;

        public SysPermissionService(IBaseRepository<UserPermission> dal, ISysRoleService roleService, ISysMenuService menuService, ISysUserRoleService userRoleService)
        {
            this.dal = dal;
            base.BaseDal = dal;
            this.roleService = roleService;
            this.menuService = menuService;
            this.userRoleService = userRoleService;
        }

        /// <summary>
        /// 获取角色数据权限
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public async Task<List<string>> GetRolePermission(int userId)
        {
            List<string> roles = new List<string>();
            // 管理员拥有所有权限
            if (UserView.IsAdmin(userId))
            {
                roles.Add("admin");
            }
            else
            {

                var roleList = await QueryMuchAsync<SysUser, SysUserRole, SysRole, SysRole>(
                     (a, b, c) => new object[] {
                        JoinType.Inner, a.UserID == b.UserID,
                        JoinType.Inner,  b.RoleID == c.RoleID
                     },
                         (a, b, c) => new SysRole
                         {
                             RoleKey = c.RoleKey
                         },
                     (a, b, c) => c.Status == SysConst.ENABLE && a.UserID == userId
                  );

                roles.AddRange(roleList.Select(x => x.RoleKey));
            }
            return roles;
        }

        /// <summary>
        /// 获取菜单数据权限
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public async Task<List<string>> GetMenuPermission(int userId)
        {
            List<string> perms = new List<string>();
            // 管理员拥有所有权限
            if (UserView.IsAdmin(userId))
            {
                perms.Add("*:*:*");
            }
            else
            {
                perms.AddRange(await menuService.SelectMenuPermsByUserId(userId));
            }
            return perms;
        }
    }
}