package com.vetti.hotake.domain.dto;

import com.vetti.common.utils.bean.BeanUtils;
import com.vetti.hotake.domain.HotakeSysNotice;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

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

/**
 * @author ID
 * @date 2025/11/1 16:50
 */
@Data
public class HotakeSysNoticeTypeNameDto {

    @ApiModelProperty("通知类型名称")
    private String noticeTypeName;

    @ApiModelProperty("数量")
    private Integer num;

    @ApiModelProperty("通知")
    private List<HotakeSysNoticeDto> list;

//    public static List<HotakeSysNoticeTypeNameDto> build(List<HotakeSysNoticeDto> list) {
//        List<HotakeSysNoticeTypeNameDto> reList = new ArrayList<>();
//        Map<String, List<HotakeSysNoticeDto>> map = new HashMap<>();
//        list.forEach(e -> {
//            String typeName = e.getNoticeTypeName();
//            if (!map.containsKey(typeName)) {
//                map.put(typeName, new ArrayList<>());
//            }
//            map.get(typeName).add(e);
//        });
//        map.forEach((k, v) -> {
//            HotakeSysNoticeTypeNameDto dto = new HotakeSysNoticeTypeNameDto();
//            dto.setNoticeTypeName(k);
//            dto.setList(v);
//            reList.add(dto);
//        });
//        return reList;
//    }

    // 优化后的分组转换方法
    public static List<HotakeSysNoticeTypeNameDto> build(List<HotakeSysNoticeDto> list) {
        // 处理空集合，避免NPE
        if (list == null) {
            return new ArrayList<>();
        }
        // 1. 分组：按 noticeTypeName 分组，自动处理键不存在的情况
        // 2. 转换：将分组结果映射为 HotakeSysNoticeTypeNameDto 列表
        return list.stream()
                // 分组：key为noticeTypeName，value为对应的HotakeSysNoticeDto列表
                .collect(Collectors.groupingBy(HotakeSysNoticeDto::getNoticeTypeName))
                // 遍历分组后的Map，转换为目标DTO
                .entrySet().stream()
                .map(entry -> {
                    HotakeSysNoticeTypeNameDto dto = new HotakeSysNoticeTypeNameDto();
                    dto.setNoticeTypeName(entry.getKey());
                    dto.setList(entry.getValue());
                    dto.setNum(entry.getValue().size());
                    return dto;
                })
                // 收集为List返回
                .collect(Collectors.toList());
    }
}
