package cn.iocoder.yudao.module.system.handler.mapnode.strategy;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationRespVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.NodeBaseDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.service.houselocation.HouseLocationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.HOUSE_LOCATION_NO_EXIST;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_DETAIL_CHANGE_ROBOT;
import static com.baomidou.mybatisplus.core.toolkit.IdWorker.getId;
@Slf4j
@Component
public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
    @Resource
    private HouseLocationService houseLocationService;
    //库位编号格式 - 第一个通配符为地图id 第二个通配符为随机数四位最后一个通配符为库位点层数
    private static final String KW_NO_FORMAT = "KW-%s-%s-%s";

    @Override
    public void processNodes(Long positionMapId, List<NodeBaseDTO> nodeBaseDTOS) {
        // -- 策略1 处理库位点
        // -- 将data里面的json 数据转为实体类 - 再对比节点id - 然后做新增删除修改操作
        List<WareHouseLocationDO> newList = new ArrayList<>();

        for (NodeBaseDTO item : nodeBaseDTOS) {
            if (item.getId() == null) {
                item.setId(getId());
            }
            item.setPositionMapId(positionMapId);
            // -- 如果是库位点 - 可能是一对多情况 - 需要将多个库位点的id set进去
            List<WareHouseLocationDO> wareHouseLocationDOS = JSONUtil.toList(item.getDataJson(), WareHouseLocationDO.class);
            // -- 筛选出 库位编号不为空 - 并且第最后一组数据 最大的值 - 如果没有则为0
            int max = wareHouseLocationDOS.stream().map(WareHouseLocationDO::getLocationNo).filter(StrUtil::isNotEmpty)
                    .mapToInt(s -> Integer.parseInt(s.substring(s.length() - 1))).max().orElse(1);
            int locationStorey = wareHouseLocationDOS.size();
            Long locationNumber = null;
            if (ObjectUtil.isNotEmpty(item.getLocationNumber())) {
                locationNumber = item.getLocationNumber();
            }
            for (WareHouseLocationDO wareHouseLocationDO : wareHouseLocationDOS) {
                wareHouseLocationDO.setLocationX(item.getLocationX());
                wareHouseLocationDO.setLocationY(item.getLocationY());
                wareHouseLocationDO.setActualLocationX(item.getActualLocationX());
                wareHouseLocationDO.setActualLocationY(item.getActualLocationY());
                if (wareHouseLocationDO.getId() == null) {
                    wareHouseLocationDO.setId(getId());
                }
                if (StrUtil.isEmpty(wareHouseLocationDO.getLocationNo())) {
                    // -- 生成库位编号 -
                    String locationNo = String.format(KW_NO_FORMAT, positionMapId, RandomUtil.randomNumbers(4), max++);
                    wareHouseLocationDO.setLocationNo(locationNo);
                }
                wareHouseLocationDO.setMapId(positionMapId);
                wareHouseLocationDO.setMapItemId(item.getId());
                if (ObjectUtil.isNotEmpty(locationNumber) && ObjectUtil.isEmpty(wareHouseLocationDO.getLocationNumber())) {
                    wareHouseLocationDO.setLocationNumber(locationNumber);
                    locationNumber = locationNumber - 10;
                }
                wareHouseLocationDO.setLocationStorey(locationStorey);
                locationStorey = locationStorey+1;
                newList.add(wareHouseLocationDO);
            }
            item.setDataJson(JSONUtil.toJsonStr(wareHouseLocationDOS));
        }

        List<WareHouseLocationDO> oldList = houseLocationService.getByMapId(positionMapId);
        List<List<WareHouseLocationDO>> list = CollectionUtils.compareLists(oldList, newList,
                (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
        houseLocationService.batchSaveOrEditOrDel(positionMapId, list);
    }
}
