package cn.iocoder.yudao.module.smartfactory.convert.packageData;

import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackagePageDataRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Mapper
public interface PackageDataConvert {

    PackageDataConvert INSTANCE = Mappers.getMapper(PackageDataConvert.class);

    default List<PackageDataDO> convertList(PackageDataCreateReqVO createReqVO) {

        List<PackageDataDO> packageDataDOS = new ArrayList<>();

        for (PackageDataSaveReqVO respVO : createReqVO.getPackageData()) {

            PackageDataDO dataDO = BeanUtils.toBean(respVO, PackageDataDO.class);

            String[] size = dataDO.getSizeName().split("\\*");
            //计算平方数
            BigDecimal squareNum = BigDecimal.valueOf((double) Integer.parseInt(size[0]) / 1000)
                    .multiply(BigDecimal.valueOf((double) Integer.parseInt(size[1]) / 1000))
                    .multiply(BigDecimal.valueOf(dataDO.getSizePieces()))
                    .multiply(BigDecimal.valueOf(Integer.sum(dataDO.getNum(), dataDO.getAutoNum())));

            //设置平方数
            dataDO.setSquareNum(squareNum);
            dataDO.setPackageDate(createReqVO.getPackageDate());

            packageDataDOS.add(dataDO);
        }

        return packageDataDOS;
    }

    default List<PackagePageDataRespVO> convertList1(List<PackageDataRespVO> dataRespVOS) {

        List<PackagePageDataRespVO> pageDataRespVOS = new ArrayList<>();

        // 按 工厂id和日期 进行分组
        Map<Long, Map<LocalDate, List<PackageDataRespVO>>> groupedByFactoryIdAndDate = dataRespVOS.stream()
                .collect(Collectors.groupingBy(PackageDataRespVO::getFactoryId,
                        Collectors.groupingBy(PackageDataRespVO::getPackageDate)));

        groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> {

            dateMap.forEach((date, infoList) -> {

                PackagePageDataRespVO dataRespVO = new PackagePageDataRespVO();
                dataRespVO.setFactoryId(factoryId);
                dataRespVO.setFactoryName(infoList.get(0).getFactoryName());
                dataRespVO.setPackageDate(date.toString());
                dataRespVO.setPackageDataS(BeanUtils.toBean(infoList, PackageDataRespVO.class));

                pageDataRespVOS.add(dataRespVO);
            });
        });

        return pageDataRespVOS;
    }
}
