using Volo.Abp.Domain.Services;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;

namespace Yi.Framework.Rbac.Domain.Managers
{
    public class RoleManager : DomainService
    {
        private ISqlSugarRepository<RoleAggregateRoot> _repository;
        private ISqlSugarRepository<RoleMenuEntity> _roleMenuRepository;
        private ISqlSugarRepository<UserRoleEntity> _userRoleRepository;
        public RoleManager(ISqlSugarRepository<RoleAggregateRoot> repository, ISqlSugarRepository<RoleMenuEntity> roleMenuRepository, ISqlSugarRepository<UserRoleEntity> userRoleRepository)
        {
            _repository = repository;
            _roleMenuRepository = roleMenuRepository;
            _userRoleRepository = userRoleRepository;
        }

        /// <summary>
        /// 给角色设置菜单
        /// </summary>
        /// <param name="roleIds"></param>
        /// <param name="menuIds"></param>
        /// <returns></returns>
        public async Task GiveRoleSetMenuAsync(List<Guid> roleIds, List<Guid> menuIds)
        {
            //这个是需要事务的，在service中进行工作单元
            await _roleMenuRepository.DeleteAsync(u => roleIds.Contains(u.RoleId));
            //添加新的关系
            List<RoleMenuEntity> roleMenuEntity = new();
            //遍历用户
            foreach (var roleId in roleIds)
            {
              
                foreach (var menu in menuIds)
                {
                    roleMenuEntity.Add(new RoleMenuEntity() { RoleId = roleId, MenuId = menu });
                }
              
            }
            //一次性批量添加
            await _roleMenuRepository.InsertRangeAsync(roleMenuEntity);
        }
        
        /// <summary>
        /// 根据角色名称移除指定用户的角色
        /// </summary>
        /// <param name="userIds">用户ID列表</param>
        /// <param name="roleName">角色名称</param>
        /// <returns>移除的角色关系数量</returns>
        public async Task<int> RemoveUserRoleByRoleCodeAsync(List<Guid> userIds, string roleName)
        {
            // 获取角色ID
            var role = await _repository._DbQueryable
                .Where(x => x.RoleCode == roleName)
                .FirstAsync();

            if (role == null)
            {
                return 0;
            }

            // 移除用户角色关系
            var removedCount = await _userRoleRepository._Db.Deleteable<UserRoleEntity>()
                .Where(x => userIds.Contains(x.UserId) && x.RoleId == role.Id)
                .ExecuteCommandAsync();
            return removedCount;
        }
    }
}
