package com.ningdatech.pmapi.sys.manage;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.pmapi.sys.model.dto.MenuDataScopeDTO;
import com.ningdatech.pmapi.sys.model.entity.Menu;
import com.ningdatech.pmapi.sys.model.entity.Role;
import com.ningdatech.pmapi.sys.model.entity.RoleMenu;
import com.ningdatech.pmapi.sys.model.entity.RoleMenuDatascope;
import com.ningdatech.pmapi.sys.model.req.RolePageReq;
import com.ningdatech.pmapi.sys.model.vo.MenuRoleVO;
import com.ningdatech.pmapi.sys.model.vo.RoleVO;
import com.ningdatech.pmapi.sys.service.IMenuService;
import com.ningdatech.pmapi.sys.service.IRoleMenuDatascopeService;
import com.ningdatech.pmapi.sys.service.IRoleMenuService;
import com.ningdatech.pmapi.sys.service.IRoleService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * 角色管理
 * </p>
 *
 * @author WendyYang
 * @since 12:01 2023/1/28
 */
@Component
@RequiredArgsConstructor
public class RoleManage {

    private final IRoleService roleService;
    private final IMenuService menuService;
    private final IRoleMenuService roleMenuService;
    private final IRoleMenuDatascopeService roleMenuDatascopeService;

    public PageVo<RoleVO> queryList(RolePageReq rolePageReq) {
        Page<Role> page = rolePageReq.page();
        LambdaQueryWrapper<Role> wrapper = Wrappers.lambdaQuery(Role.class);
        searchList(page, wrapper, rolePageReq);
        List<RoleVO> data = CollUtils.convert(page.getRecords(), w -> BeanUtil.copyProperties(w, RoleVO.class));
        return PageVo.of(data, page.getTotal());
    }

    private void searchList(Page<Role> page, LambdaQueryWrapper<Role> wrapper, RolePageReq req) {
        wrapper.like(StringUtils.isNotBlank(req.getName()), Role::getName, req.getName())
                .eq(req.getFixed() != null, Role::getFixed, req.getFixed())
                .orderByDesc(Role::getUpdateOn);
        roleService.page(page, wrapper);
    }


    public void buildMenu(RoleVO query) {
        //改成直接返回有权限的
        List<Menu> list = menuService.list(Wrappers.lambdaQuery(Menu.class).orderByAsc(Menu::getSort));
        List<RoleMenu> roleMenus = roleMenuService.list(Wrappers.lambdaQuery(RoleMenu.class)
                .eq(RoleMenu::getRoleId, query.getId()));
        List<MenuRoleVO> menus = list.stream().map(menu -> {
            for (RoleMenu roleMenu : roleMenus) {
                if (roleMenu.getMenuId().equals(menu.getId())) {
                    return BeanUtil.copyProperties(menu, MenuRoleVO.class);
                }
            }
            return null;
        }).filter(Objects::nonNull).collect(Collectors.toList());
        query.setMenu(menus);
    }

    public List<MenuDataScopeDTO> getMenuDataScope(Long roleId) {
        LambdaQueryWrapper<RoleMenuDatascope> query = Wrappers.lambdaQuery(RoleMenuDatascope.class)
                .eq(RoleMenuDatascope::getRoleId, roleId);
        List<RoleMenuDatascope> menuDataScopes = roleMenuDatascopeService.list(query);
        return CollUtils.convert(menuDataScopes, w -> {
            MenuDataScopeDTO dto = new MenuDataScopeDTO();
            dto.setDataScope(w.getDatascope());
            dto.setMenuId(w.getMenuId());
            return dto;
        });
    }

}
