package org.jeecg.modules.device.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.device.entity.BuDeviceType;
import org.jeecg.modules.device.entity.Part;
import org.jeecg.modules.device.mapper.BuDeviceTypeMapper;
import org.jeecg.modules.device.service.IBuDeviceTypeService;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;


/**
 * @Description: 设备类型
 * @Author: jeecg-boot
 * @Date:   2024-04-25
 * @Version: V1.0
 */
@Service
public class BuDeviceTypeServiceImpl extends ServiceImpl<BuDeviceTypeMapper, BuDeviceType> implements IBuDeviceTypeService {

    // 构建部件树结构
    public List<BuDeviceType> buildTree(List<BuDeviceType> deviceTypes) {
        if (deviceTypes == null || deviceTypes.isEmpty()) {
            return Collections.emptyList(); // 空输入直接返回，减少无效操作
        }

        deviceTypes.forEach(item -> {
            List<BuDeviceType> subTypes = baseMapper.selectList(new LambdaQueryWrapper<BuDeviceType>().eq(BuDeviceType::getPid, item.getId()));
            subTypes = buildTree(subTypes);
            item.setSubTypes(subTypes);
        });

//        // 优化 HashMap 初始容量，减少扩容开销
//        Map<String, BuDeviceType> typeMap = new HashMap<>(deviceTypes.size());
//        // 使用 forEach 填充 Map，代码更简洁
//        deviceTypes.forEach(type -> typeMap.put(type.getId(), type));
//
//        List<BuDeviceType> rootList = new ArrayList<>();
//        for (BuDeviceType type : deviceTypes) {
//            String pid = type.getId();
//            if (pid == null || pid.trim().isEmpty()) {
//                rootList.add(type);
//            } else {
//                BuDeviceType parent = typeMap.get(pid);
//                if (parent != null) {
//                    // 使用 computeIfAbsent 简化子列表初始化
//                    parent.setSubTypes(
//                            Optional.ofNullable(parent.getSubTypes()).orElseGet(ArrayList::new)
//                    );
//                    parent.getSubTypes().add(type);
//                }
//            }
//        }

        return deviceTypes;
    }

}
