package cn.iocoder.yudao.module.identity.service.diversionstats;

import cn.iocoder.yudao.module.identity.enums.ErrorCodeConstants;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import cn.iocoder.yudao.module.identity.controller.admin.diversionstats.vo.*;
import cn.iocoder.yudao.module.identity.dal.dataobject.diversionstats.DiversionStatsDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

import cn.iocoder.yudao.module.identity.convert.diversionstats.DiversionStatsConvert;
import cn.iocoder.yudao.module.identity.dal.mysql.diversionstats.DiversionStatsMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * 窜货统计 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class DiversionStatsServiceImpl implements DiversionStatsService {

    @Resource
    private DiversionStatsMapper diversionStatsMapper;

    /**
     * 创建窜货统计
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    @Override
    public Long createDiversionStats(DiversionStatsCreateReqVO createReqVO) {
        // 插入
        DiversionStatsDO diversionStats = DiversionStatsConvert.INSTANCE.convert(createReqVO);
        diversionStatsMapper.insert(diversionStats);
        // 返回
        return diversionStats.getId();
    }

    /**
     * 更新窜货统计
     *
     * @param updateReqVO 更新信息
     */
    @Override
    public void updateDiversionStats(DiversionStatsUpdateReqVO updateReqVO) {
        // 校验存在
        validateDiversionStatsExists(updateReqVO.getId());
        // 更新
        DiversionStatsDO updateObj = DiversionStatsConvert.INSTANCE.convert(updateReqVO);
        diversionStatsMapper.updateById(updateObj);
    }

    /**
     * 删除窜货统计
     *
     * @param id 编号
     */
    @Override
    public void deleteDiversionStats(Long id) {
        // 校验存在
        validateDiversionStatsExists(id);
        // 删除
        diversionStatsMapper.deleteById(id);
    }

    private void validateDiversionStatsExists(Long id) {
        if (diversionStatsMapper.selectById(id) == null) {
            throw exception(ErrorCodeConstants.DIVERSION_STATS_NOT_EXISTS);
        }
    }

    /**
     * 获得窜货统计
     *
     * @param id 编号
     * @return 窜货统计
     */
    @Override
    public DiversionStatsDO getDiversionStats(Long id) {
        return diversionStatsMapper.selectById(id);
    }

    /**
     * 获得窜货统计列表
     *
     * @param ids 编号
     * @return 窜货统计列表
     */
    @Override
    public List<DiversionStatsDO> getDiversionStatsList(Collection<Long> ids) {
        return diversionStatsMapper.selectBatchIds(ids);
    }

    /**
     * 获得窜货统计分页
     *
     * @param pageReqVO 分页查询
     * @return 窜货统计分页
     */
    @Override
    public PageResult<DiversionStatsDO> getDiversionStatsPage(DiversionStatsPageReqVO pageReqVO) {
        Page<DiversionStatsDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
        IPage<DiversionStatsDO> diversionStatsDOIPage = diversionStatsMapper.selectStatisticalIdenticalData(page,
                pageReqVO.getBelongBusinessName(),
                pageReqVO.getGoodsId(),
                pageReqVO.getGoodsName(),
                pageReqVO.getDealerName(),
                pageReqVO.getDealerId());
        PageResult<DiversionStatsDO> diversionStatsDOPageResult = new PageResult<DiversionStatsDO>().setList(diversionStatsDOIPage.getRecords());
        diversionStatsDOPageResult.setTotal(diversionStatsDOIPage.getTotal());
        return diversionStatsDOPageResult;
    }

    /**
     * 获得窜货统计列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 窜货统计列表
     */
    @Override
    public List<DiversionStatsDO> getDiversionStatsList(DiversionStatsExportReqVO exportReqVO) {
        List<DiversionStatsDO> statsList = diversionStatsMapper.selectList(exportReqVO);
        Map<String, DiversionStatsDO> statsMap = new HashMap<>();

        // 遍历窜货统计列表
        for (DiversionStatsDO stats : statsList) {
            // 构建键值
            String key = generateKey(stats);

            // 如果键已存在于Map中，则说明有重复的记录，需要增加num值
            if (statsMap.containsKey(key)) {
                DiversionStatsDO existingStats = statsMap.get(key);
                existingStats.setNum(existingStats.getNum() + 1);
            } else {
                // 如果键不存在于Map中，则将当前记录加入Map
                statsMap.put(key, stats);
            }
        }

        // 将Map中的值转换为List，并返回窜货统计列表
        return new ArrayList<>(statsMap.values());
    }


    // 生成键值的方法
    private String generateKey(DiversionStatsDO stats) {
        // 根据要求的字段构建键值
        return stats.getBelongBusinessId() + "_" + stats.getGoodsId() + "_" + stats.getGoodsName()
                + "_" + stats.getDealerName() + "_" + stats.getDealerId();
    }
}
