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

import com.yhy.module.core.controller.admin.quota.vo.QuotaCatalogTreeRespVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaCatalogTreeSaveReqVO;
import java.util.List;
import javax.validation.Valid;

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

    /**
     * 创建定额子目树节点
     */
    Long createCatalogTree(@Valid QuotaCatalogTreeSaveReqVO createReqVO);

    /**
     * 更新定额子目树节点
     */
    void updateCatalogTree(@Valid QuotaCatalogTreeSaveReqVO updateReqVO);

    /**
     * 删除定额子目树节点
     */
    void deleteCatalogTree(Long id);

    /**
     * 获取定额子目树节点详情
     */
    QuotaCatalogTreeRespVO getCatalogTree(Long id);

    /**
     * 获取定额子目树节点列表
     */
    List<QuotaCatalogTreeRespVO> getCatalogTreeList(Long catalogItemId, Long parentId);

    /**
     * 获取定额子目树结构
     */
    List<QuotaCatalogTreeRespVO> getCatalogTreeTree(Long catalogItemId);

    /**
     * 交换排序
     */
    void swapSort(Long nodeId1, Long nodeId2);

    /**
     * 根据费率项ID查询绑定的定额子目树
     * 
     * @param rateItemId 费率项ID
     * @return 绑定的定额子目树列表
     */
    List<QuotaCatalogTreeRespVO> getCatalogTreeByRateItem(Long rateItemId);

    /**
     * 根据费率模式节点ID查询所属定额专业的子目录树
     * 
     * 业务逻辑：
     * 1. 验证传入的节点是 rate_mode 类型
     * 2. 向上追溯找到所属的定额专业节点（node_type='specialty'）
     * 3. 查询该定额专业节点下的所有子目录树（第二层）
     *
     * @param rateModeNodeId 费率模式节点ID
     * @return 子目录树列表
     */
    List<QuotaCatalogTreeRespVO> getCatalogTreeByRateModeNode(Long rateModeNodeId);
}
