package cn.bunny.services.service.impl;

import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.dao.dto.system.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconUpdateDto;
import cn.bunny.dao.entity.system.MenuIcon;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.system.MenuIconVo;
import cn.bunny.services.mapper.MenuIconMapper;
import cn.bunny.services.service.MenuIconService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.validation.Valid;
import org.springframework.beans.BeanUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

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

/**
 * <p>
 * 系统菜单图标 服务实现类
 * </p>
 *
 * @author Bunny
 * @since 2024-10-02 12:18:29
 */
@Service
public class MenuIconServiceImpl extends ServiceImpl<MenuIconMapper, MenuIcon> implements MenuIconService {

    /**
     * * 系统菜单图标 服务实现类
     *
     * @param pageParams 系统菜单图标分页查询page对象
     * @param dto        系统菜单图标分页查询对象
     * @return 查询分页系统菜单图标返回对象
     */
    @Override
    public PageResult<MenuIconVo> getMenuIconList(Page<MenuIcon> pageParams, MenuIconDto dto) {
        // 分页查询菜单图标
        IPage<MenuIcon> page = baseMapper.selectListByPage(pageParams, dto);

        List<MenuIconVo> voList = page.getRecords().stream().map(MenuIcon -> {
            MenuIconVo MenuIconVo = new MenuIconVo();
            BeanUtils.copyProperties(MenuIcon, MenuIconVo);
            return MenuIconVo;
        }).toList();

        return PageResult.<MenuIconVo>builder()
                .list(voList)
                .pageNo(page.getCurrent())
                .pageSize(page.getSize())
                .total(page.getTotal())
                .build();
    }

    /**
     * * 获取查询图标名称列表
     *
     * @param iconName 查询图标名称
     * @return 图标返回列表
     */
    @Override
    @Cacheable(cacheNames = "menuIcon", key = "'menuIconList'", cacheManager = "cacheManagerWithMouth")
    public List<MenuIconVo> getIconNameList(String iconName) {
        return list(Wrappers.<MenuIcon>lambdaQuery().like(MenuIcon::getIconName, iconName))
                .stream().map(menuIcon -> {
                    MenuIconVo menuIconVo = new MenuIconVo();
                    BeanUtils.copyProperties(menuIcon, menuIconVo);
                    return menuIconVo;
                }).collect(Collectors.collectingAndThen(
                        Collectors.toMap(
                                MenuIconVo::getIconName,
                                i -> i,
                                (existing, replacement) -> existing
                        ),
                        map -> new ArrayList<>(map.values())
                ));
    }

    /**
     * 添加系统菜单图标
     *
     * @param dto 系统菜单图标添加
     */
    @Override
    @CacheEvict(cacheNames = "menuIcon", key = "'menuIconList'", beforeInvocation = true)
    public void addMenuIcon(MenuIconAddDto dto) {
        // 保存数据
        MenuIcon menuIcon = new MenuIcon();
        BeanUtils.copyProperties(dto, menuIcon);
        save(menuIcon);
    }

    /**
     * 更新系统菜单图标
     *
     * @param dto 系统菜单图标更新
     */
    @Override
    @CacheEvict(cacheNames = "menuIcon", key = "'menuIconList'", beforeInvocation = true)
    public void updateMenuIcon(@Valid MenuIconUpdateDto dto) {
        // 更新内容
        MenuIcon menuIcon = new MenuIcon();
        BeanUtils.copyProperties(dto, menuIcon);
        updateById(menuIcon);
    }

    /**
     * 删除|批量删除系统菜单图标
     *
     * @param ids 删除id列表
     */
    @Override
    @CacheEvict(cacheNames = "menuIcon", key = "'menuIconList'", beforeInvocation = true)
    public void deleteMenuIcon(List<Long> ids) {
        // 判断数据请求是否为空
        if (ids.isEmpty()) throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY);

        baseMapper.deleteBatchIdsWithPhysics(ids);
    }
}
