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 java.util.List;
import javax.validation.Valid;

/**
 * 定额基价 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);

    /**
     * 更新定额基价的四个价格字段
     * 
     * @param quotaItemId 定额基价ID
     * @param taxExclBasePrice 除税定额单价
     * @param taxInclBasePrice 含税定额单价
     * @param taxExclCompilePrice 除税编制单价
     * @param taxInclCompilePrice 含税编制单价
     */
    void updateQuotaItemPrices(Long quotaItemId, java.math.BigDecimal taxExclBasePrice, 
            java.math.BigDecimal taxInclBasePrice, java.math.BigDecimal taxExclCompilePrice, 
            java.math.BigDecimal taxInclCompilePrice);

    /**
     * 根据编码查询定额基价
     * 
     * @param code 编码
     * @return 定额基价列表（可能有多个匹配）
     */
    List<QuotaItemRespVO> getQuotaItemByCode(String code);

    /**
     * 获取定额基价对应的费率模式节点ID
     * 
     * 通过向上追溯到定额专业节点，然后查找其下的费率模式子节点
     *
     * @param quotaItemId 定额基价ID
     * @return 费率模式节点ID，如果不存在则返回null
     */
    Long getRateModeIdByQuotaItem(Long quotaItemId);

    /**
     * 获取定额基价对应的定额专业节点ID
     * 
     * 通过向上追溯到定额专业节点（nodeType='specialty'）
     *
     * @param quotaItemId 定额基价ID
     * @return 定额专业节点ID，如果不存在则返回null
     */
    Long getSpecialtyIdByQuotaItem(Long quotaItemId);
}
