package com.liang.service.impl;

import com.liang.entity.LayuiTree;
import com.liang.entity.SysPermissionInfo;
import com.liang.dao.SysPermissionInfoDao;
import com.liang.service.SysPermissionInfoService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * (SysPermissionInfo)表服务实现类
 *
 * @author makejava
 * @since 2023-02-19 21:37:38
 */
@Service("sysPermissionInfoService")
public class SysPermissionInfoServiceImpl implements SysPermissionInfoService {
    @Resource
    private SysPermissionInfoDao sysPermissionInfoDao;

    /**
     * 通过ID查询单条数据
     *
     * @param permissionId 主键
     * @return 实例对象
     */
    @Override
    public SysPermissionInfo queryById(String permissionId) {
        return this.sysPermissionInfoDao.queryById(permissionId);
    }

    /**
     * 分页查询
     *
     * @param sysPermissionInfo 筛选条件
     * @param pageRequest       分页对象
     * @return 查询结果
     */
    @Override
    public Page<SysPermissionInfo> queryByPage(SysPermissionInfo sysPermissionInfo, PageRequest pageRequest) {
        long total = this.sysPermissionInfoDao.count(sysPermissionInfo);
        return new PageImpl<>(this.sysPermissionInfoDao.queryAllByLimit(sysPermissionInfo, pageRequest), pageRequest, total);
    }

    /**
     * 新增数据
     *
     * @param sysPermissionInfo 实例对象
     * @return 实例对象
     */
    @Override
    public int insert(SysPermissionInfo sysPermissionInfo) {
        return this.sysPermissionInfoDao.insert(sysPermissionInfo);
    }

    /**
     * 修改数据
     *
     * @param sysPermissionInfo 实例对象
     * @return 实例对象
     */
    @Override
    public int update(SysPermissionInfo sysPermissionInfo) {
        return this.sysPermissionInfoDao.update(sysPermissionInfo);
    }

    /**
     * 通过主键删除数据
     *
     * @param permissionId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(String permissionId) {
        return this.sysPermissionInfoDao.deleteById(permissionId) > 0;
    }

    /**
     * 获取系统菜单
     *
     * @param userId
     * @return
     */
    @Override
    public List<Map> menuInit(int userId) {
        return this.sysPermissionInfoDao.menuInit(userId);
    }

    /**
     * 查询菜单列表
     *
     * @return
     */
    @Override
    public List<SysPermissionInfo> list() {

        return this.sysPermissionInfoDao.list();
    }


    /**
     * 获取权限列表
     *
     * @return
     */
    @Override
    public List<Map<String, Object>> listPermission() {
        List<Map<String, Object>> list = sysPermissionInfoDao.listPermission();
        return list;
    }


    /**
     * 禁用一个菜单
     *
     * @param permissionId
     * @return
     */
    @Override
    public int forbid(String permissionId) {
        List<LayuiTree> list = sysPermissionInfoDao.listTree();
        List<LayuiTree> childList = findChildList(list, permissionId);

        List<String> perIdStr = new ArrayList<>();
        perIdStr.add(permissionId);
        if (CollectionUtils.isNotEmpty(childList)) {
            childList.forEach(item -> {
                perIdStr.add(item.getPermissionId());
            });
        }
//        // 这样就拿到了自己和子节点的permissionId，再去数据库里做禁用就可以了
//        if (logger.isInfoEnabled()) {
//            logger.info("SysPermissionInfoServiceImpl - forbid - perIdStr={}", perIdStr);
//        }
        int num = sysPermissionInfoDao.forbid(perIdStr);
        return num;
    }


    /**
     * 启用一个菜单
     *
     * @param permissionId
     * @return
     */
    @Override
    public int enable(String permissionId) {
        List<LayuiTree> list = sysPermissionInfoDao.listTree();
        List<LayuiTree> childList = findChildList(list, permissionId);

        List<String> perIdStr = new ArrayList<>();
        perIdStr.add(permissionId);
        if (CollectionUtils.isNotEmpty(childList)) {
            childList.forEach(item -> {
                perIdStr.add(item.getPermissionId());
            });
        }
//        // 这样就拿到了自己和子节点的permissionId，再去数据库里做禁用就可以了
//        if (logger.isInfoEnabled()) {
//            logger.info("SysPermissionInfoServiceImpl - enable - perIdStr={}", perIdStr);
//        }
        int num = sysPermissionInfoDao.enable(perIdStr);
        return num;
    }

    /**
     * 获取某个父节点下的所有子节点
     *
     * @param menuList 这里传入的是id、pid形式数据，即从菜单表里查出来的原始记录，没经过树化的数据
     * @param pid      父节点
     * @return
     */
    public static List<LayuiTree> findChildList(List<LayuiTree> menuList, String pid) {
        // 子节点
        List<LayuiTree> childMenu = new ArrayList<>();
        return recursionChildList(menuList, pid, childMenu);
    }


    /**
     * 获取子节点
     *
     * @param menuList 这里传入的是id、pid形式数据，即从菜单表里查出来的原始记录，没经过树化的数据
     * @param pid      父节点
     * @return
     */
    private static List<LayuiTree> recursionChildList(List<LayuiTree> menuList, String pid, List<LayuiTree> childMenu) {
        for (LayuiTree mu : menuList) {
            // 遍历出父id等于参数的id，add进子节点集合
            if (mu.getParentId().equals(pid)) {
                // 递归遍历下一级
                recursionChildList(menuList, mu.getPermissionId(), childMenu);
                childMenu.add(mu);
            }
        }
        return childMenu;
    }


    /**
     * 修改菜单顺序
     *
     * @param sysPermissionInfo
     * @return
     */
    @Override
    public int updateSort(SysPermissionInfo sysPermissionInfo) {
        return sysPermissionInfoDao.updateSort(sysPermissionInfo);
    }

    /**
     * 权限检查
     *
     * @param sign
     * @param userId
     * @return
     */
    @Override
    public int checkPermission(String sign, Integer userId) {
        return sysPermissionInfoDao.checkPermission(sign, userId);
    }

}
