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

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
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.*;
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO;
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandProductDO;
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldBrandTreeRespVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO;

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 MoldBrandService {

    /**
     * 创建模具型号
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createMoldBrand(@Valid MoldBrandSaveReqVO createReqVO);

    /**
     * 更新模具型号
     *
     * @param updateReqVO 更新信息
     */
    void updateMoldBrand(@Valid MoldBrandSaveReqVO updateReqVO);

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

    /**
     * 获得模具型号
     *
     * @param id 编号
     * @return 模具型号
     */
    MoldBrandDO getMoldBrand(Long id);
     List<MoldBrandDO> selectBy(MoldBrandPageReqVO reqVO);
    /**
     * 获得模具型号分页
     *
     * @param pageReqVO 分页查询
     * @return 模具型号分页
     */
    PageResult<MoldBrandRespVO> getMoldBrandPage(MoldBrandPageReqVO pageReqVO);
    default Map<Long, MoldBrandDO> getMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getList(ids), MoldBrandDO::getId);
    }
    List<MoldBrandDO> getList(Collection<Long> ids);
    // ==================== 子表（模具） ====================

    /**
     * 获得模具分页
     *
     * @param pageReqVO 分页查询
     * @param brandId 型号id
     * @return 模具分页
     */
    PageResult<MoldRespVO> getMoldPage(PageParam pageReqVO, Long brandId);
    /**
     * 获得模具分页
     *
     * @param pageReqVO 分页查询
     * @return 模具分页
     */
    PageResult<MoldRespVO> getMoldPage(MoldPageReqVO pageReqVO);

    List<MoldDO> getMoldList();

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

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

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

	/**
	 * 获得模具
	 *
	 * @param id 编号
     * @return 模具
	 */
    MoldDO getMold(Long id);
    List<MoldDO> selectBy(MoldDO reqVO);
    // ==================== 子表（模具产品） ====================

    /**
     * 获得模具产品分页
     *
     * @param pageReqVO 分页查询
     * @param brandId 型号ID
     * @return 模具产品分页
     */
    PageResult<MoldBrandProductDO> getMoldBrandProductPage(PageParam pageReqVO, Long brandId);
    List<MoldProductRespVO> buildProduct(List<MoldBrandProductDO> list);
    /**
     * 创建模具产品
     *
     * @param moldBrandProduct 创建信息
     * @return 编号
     */
    Long createMoldBrandProduct(@Valid MoldBrandProductDO moldBrandProduct);

    /**
     * 更新模具产品
     *
     * @param moldBrandProduct 更新信息
     */
    void updateMoldBrandProduct(@Valid MoldBrandProductDO moldBrandProduct);

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

    /**
     * 获得模具产品
     *
     * @param id 编号
     * @return 模具产品
     */
    MoldBrandProductDO getMoldBrandProduct(Long id);

    List<MoldDO> getAllList();


    /**
     * 获得产品分类列表
     *
     * @param ids 编号数组
     * @return 产品分类列表
     */
    List<MoldBrandDO> getMoldBrandList(Collection<Long> ids);

    /**
     * 获得产品分类 Map
     *
     * @param ids 编号数组
     * @return 产品分类 Map
     */
    default Map<Long, MoldBrandDO> getMoldBrandMap(Collection<Long> ids) {
        if(ids.isEmpty())return new HashMap<>();
        return convertMap(getMoldBrandList(ids), MoldBrandDO::getId);
    }

    List<MoldBrandTreeRespVO> getMoldBrandTree();
}