package com.jwipc.sys.logic.impl;

import cn.hutool.core.lang.Pair;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jwipc.security.LoginUtil;
import com.jwipc.sys.convert.RoleResConvert;
import com.jwipc.sys.convert.UserShortcutConvert;
import com.jwipc.sys.dto.RoleResDTO;
import com.jwipc.sys.dto.UserShortcutDTO;
import com.jwipc.sys.entity.UserShortcut;
import com.jwipc.sys.logic.ShortcutLogic;
import com.jwipc.sys.model.po.RoleResPO;
import com.jwipc.sys.model.po.UserShortcutPO;
import com.jwipc.sys.service.IRoleResService;
import com.jwipc.sys.service.IUserShortcutService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * <p> </p>
 *
 * @author BOGON
 * @version 1.0
 * @since JDK 1.8
 */
@Service
@RequiredArgsConstructor
public class ShortcutLogicImpl implements ShortcutLogic {
    private final IUserShortcutService userShortcutService;
    private final UserShortcutConvert userShortcutConvert;
    private final IRoleResService roleResService;
    private final RoleResConvert roleResConvert;

    @Override
    public List<UserShortcutDTO> getUserShortcut() {
        List<UserShortcutPO> userShortcutPOS = userShortcutService.selectUserShortcut(LoginUtil.getUserId());
        return userShortcutConvert.pos2DTOs(userShortcutPOS);
    }

    @Override
    public void saveConfig(String userShortcutJson) {
        final String userName = LoginUtil.getName();
        userShortcutService.remove(new LambdaQueryWrapper<UserShortcut>().eq(UserShortcut::getAccountName, userName));
        List<UserShortcut> userShortcutList = JSON.parseArray(userShortcutJson, UserShortcut.class);
        userShortcutList.forEach(u -> u.setAccountName(userName));
        userShortcutService.saveBatch(userShortcutList);
    }

    @Override
    public Pair<List<RoleResDTO>, List<UserShortcutDTO>> getUserRes() {
        final Long userId = LoginUtil.getUserId();
        List<RoleResPO> roleResPOS = roleResService.getByUser(userId);
        List<RoleResDTO> roleResDTOS = roleResConvert.pos2DTOs(roleResPOS);
        List<UserShortcutPO> userShortcutPOS = userShortcutService.selectUserShortcut(LoginUtil.getUserId());
        final List<UserShortcutDTO> userShortcutDTOS = userShortcutConvert.pos2DTOs(userShortcutPOS);
        List<Long> idList = userShortcutDTOS.parallelStream().map(UserShortcutDTO::getResId).toList();
        roleResDTOS.forEach(e -> {
            if (idList.contains(e.getResId())) {
                e.setChecked(true);
            } else {
                e.setChecked(false);
            }
        });
        return Pair.of(roleResDTOS, userShortcutDTOS);
    }
}