package cn.iocoder.yudao.module.erp.service.mold;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.common.controller.admin.mold.vo.MoldPageReqVO;
import cn.iocoder.yudao.module.common.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.common.controller.admin.mold.vo.MoldSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * 模具 Service 接口
 *
 * @author 内蒙必硕
 */
public interface MoldService {

    /**
     * 创建模具
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createMold(@Valid MoldSaveReqVO createReqVO);

    /**
     * 更新模具
     *
     * @param updateReqVO 更新信息
     */
    void updateMold(@Valid MoldSaveReqVO updateReqVO);

    /**
     * 删除模具
     *
     * @param id 编号
     */
    void deleteMold(Long id);

    /**
     * 获得模具
     *
     * @param id 编号
     * @return 模具
     */
    MoldDO getMold(Long id);

    /**
     * 获得模具分页
     *
     * @param pageReqVO 分页查询
     * @return 模具分页
     */
    PageResult<MoldDO> getMoldPage(MoldPageReqVO pageReqVO);
    List<MoldDO> getList(Collection<Long> ids);
    default Map<Long, MoldDO> getMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getList(ids), MoldDO::getId);
    }

    /**
     * 校验模具们的有效性
     *
     * @param ids 编号数组
     * @return 模具列表
     */
    List<MoldDO> validMoldList(Collection<Long> ids);

    /**
     * 获得产品 VO 列表
     *
     * @param ids 编号数组
     * @return 产品 VO 列表
     */
    List<MoldRespVO> getMoldVOList(Collection<Long> ids);

    /**
     * 获得模具 VO Map
     *
     * @param ids 编号数组
     * @return 模具 VO Map
     */
    default Map<Long, MoldRespVO> getMoldVOMap(Collection<Long> ids) {
        if(ids.isEmpty())return new HashMap<>();
        return convertMap(getMoldVOList(ids), MoldRespVO::getId);
    }

    List<MoldRespVO> buildMoldVOList(List<MoldDO> list);

    List<MoldDO> getInTransitMoldAllList();

    List<MoldDO> getMoldListByStatus(Long status);
}