package com.yhy.module.core.service.quota;

import com.yhy.module.core.controller.admin.quota.vo.QuotaResourceRespVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaResourceSaveReqVO;
import com.yhy.module.core.controller.admin.resource.vo.ResourceItemRespVO;
import com.yhy.module.core.dal.dataobject.quota.QuotaResourceDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 定额工料机组成 Service 接口
 * 
 * @author yhy
 */
public interface QuotaResourceService {

    /**
     * 添加定额工料机组成
     * 
     * 业务规则：
     * 1. 验证工料机是否在定额专业的数据范围内
     * 2. 自动快照工料机的基本信息（编码、名称、单位、价格）
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createQuotaResource(@Valid QuotaResourceSaveReqVO createReqVO);

    /**
     * 更新定额工料机组成
     *
     * @param updateReqVO 更新信息
     */
    void updateQuotaResource(@Valid QuotaResourceSaveReqVO updateReqVO);

    /**
     * 删除定额工料机组成
     *
     * @param id 编号
     */
    void deleteQuotaResource(Long id);

    /**
     * 获得定额工料机组成
     *
     * @param id 编号
     * @return 定额工料机组成
     */
    QuotaResourceDO getQuotaResource(Long id);

    /**
     * 获得定额工料机组成列表
     *
     * @param quotaItemId 定额子目ID
     * @return 定额工料机组成列表
     */
    List<QuotaResourceRespVO> getQuotaResourceList(Long quotaItemId);

    /**
     * 获取可选的工料机列表（已过滤范围）
     * 
     * 只返回定额专业绑定的工料机专业下的工料机数据
     *
     * @param quotaItemId 定额子目ID
     * @return 可选的工料机列表
     */
    List<ResourceItemRespVO> getAvailableResourceItems(Long quotaItemId);

    /**
     * 验证工料机是否在定额专业的数据范围内
     *
     * @param quotaItemId 定额子目ID
     * @param resourceItemId 工料机ID
     * @throws cn.iocoder.yudao.framework.common.exception.ServiceException 如果不在范围内
     */
    void validateResourceInScope(Long quotaItemId, Long resourceItemId);

    /**
     * 批量添加定额工料机组成
     *
     * @param quotaItemId 定额子目ID
     * @param resources 工料机组成列表
     */
    void batchCreateQuotaResources(Long quotaItemId, List<QuotaResourceSaveReqVO> resources);
}
