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

import com.yhy.module.core.controller.admin.quota.vo.QuotaCatalogItemRespVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaCatalogItemSaveReqVO;
import com.yhy.module.core.controller.admin.resource.vo.ResourceCategoryFullRespVO;
import com.yhy.module.core.dal.dataobject.quota.QuotaCatalogItemDO;
import java.util.List;
import javax.validation.Valid;

/**
 * 定额目录条目 Service 接口
 * 
 * @author yhy
 */
public interface QuotaCatalogItemService {

    /**
     * 创建定额目录条目
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createQuotaCatalogItem(@Valid QuotaCatalogItemSaveReqVO createReqVO);

    /**
     * 更新定额目录条目
     *
     * @param updateReqVO 更新信息
     */
    void updateQuotaCatalogItem(@Valid QuotaCatalogItemSaveReqVO updateReqVO);

    /**
     * 删除定额目录条目
     *
     * @param id 编号
     */
    void deleteQuotaCatalogItem(Long id);

    /**
     * 获得定额目录条目
     *
     * @param id 编号
     * @return 定额目录条目
     */
    QuotaCatalogItemDO getQuotaCatalogItem(Long id);

    /**
     * 获得定额专业节点列表（第一层）
     *
     * @return 定额专业节点列表
     */
    List<QuotaCatalogItemRespVO> getQuotaCatalogItemList();

    /**
     * 获得指定节点的子节点列表
     *
     * @param parentId 父节点ID
     * @return 子节点列表
     */
    List<QuotaCatalogItemRespVO> getChildrenByParentId(Long parentId);

    /**
     * 绑定工料机专业
     * 
     * 业务规则：
     * 1. 只有 node_type='specialty' 的节点才能绑定
     * 2. 只能绑定 node_type='specialty' 的机类树节点
     * 3. 绑定后不可修改（specialty_locked=true）
     *
     * @param catalogItemId 定额专业节点ID
     * @param categoryTreeId 工料机专业节点ID
     */
    void bindResourceSpecialty(Long catalogItemId, Long categoryTreeId);

    /**
     * 验证节点类型
     *
     * @param id 节点ID
     * @param expectedType 期望的节点类型
     */
    void validateNodeType(Long id, String expectedType);

    /**
     * 获取定额专业树结构（第一层）
     *
     * @param excludeNodeTypes 要排除的节点类型列表
     * @return 树形结构
     */
    List<QuotaCatalogItemRespVO> getQuotaCatalogItemTree(List<String> excludeNodeTypes);

    /**
     * 交换两个节点的排序
     *
     * @param nodeId1 节点1的ID
     * @param nodeId2 节点2的ID
     */
    void swapSort(Long nodeId1, Long nodeId2);

    /**
     * 通过费率模式节点获取关联的工料机类别字典（含价格代码）
     * 
     * 业务逻辑：
     * 1. 如果传入的是费率模式节点，向上查找定额专业节点
     * 2. 获取定额专业节点绑定的 category_tree_id
     * 3. 查询该工料机专业下的所有类别字典（含价格代码）
     *
     * @param catalogItemId 定额目录节点ID（可以是费率模式节点或定额专业节点）
     * @return 类别字典列表（含价格代码）
     */
    List<ResourceCategoryFullRespVO> getCategoriesByCatalogItem(Long catalogItemId);
}
