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

import com.yhy.module.core.controller.admin.quota.vo.QuotaItemRespVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaItemSaveReqVO;
import com.yhy.module.core.dal.dataobject.quota.QuotaItemDO;

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

/**
 * 定额子目 Service 接口
 * 
 * @author yhy
 */
public interface QuotaItemService {

    /**
     * 创建定额子目
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createQuotaItem(@Valid QuotaItemSaveReqVO createReqVO);

    /**
     * 更新定额子目
     *
     * @param updateReqVO 更新信息
     */
    void updateQuotaItem(@Valid QuotaItemSaveReqVO updateReqVO);

    /**
     * 删除定额子目
     *
     * @param id 编号
     */
    void deleteQuotaItem(Long id);

    /**
     * 获得定额子目
     *
     * @param id 编号
     * @return 定额子目
     */
    QuotaItemDO getQuotaItem(Long id);

    /**
     * 获得定额子目详情（包含工料机组成）
     *
     * @param id 编号
     * @return 定额子目详情
     */
    QuotaItemRespVO getQuotaItemDetail(Long id);

    /**
     * 获得定额子目列表
     *
     * @param catalogItemId 定额条目ID
     * @return 定额子目列表
     */
    List<QuotaItemRespVO> getQuotaItemList(Long catalogItemId);

    /**
     * 计算定额基价
     * 
     * 基价 = Σ(resource_price * dosage * (1 + loss_rate))
     *
     * @param id 定额子目ID
     * @return 计算后的基价
     */
    void calculateBasePrice(Long id);

    /**
     * 获取定额子目绑定的工料机专业ID
     * 
     * 通过向上追溯到定额专业节点，获取其绑定的 category_tree_id
     *
     * @param quotaItemId 定额子目ID
     * @return 工料机专业ID
     */
    Long getCategoryTreeIdByQuotaItem(Long quotaItemId);
}
