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.dal.dataobject.quota.QuotaCatalogItemDO;

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

/**
 * 定额目录条目 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);

    /**
     * 获得定额目录条目列表
     *
     * @param parentId 父节点ID
     * @return 定额目录条目列表
     */
    List<QuotaCatalogItemRespVO> getQuotaCatalogItemList(Long parentId);

    /**
     * 获得定额目录树
     *
     * @return 定额目录树
     */
    List<QuotaCatalogItemRespVO> getQuotaCatalogItemTree();

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

    /**
     * 添加目录节点
     * 
     * 业务规则：
     * 1. 父节点必须是 content_type='directory' 或根节点
     * 2. 自动设置 content_type='directory', allow_children=true
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long addDirectory(@Valid QuotaCatalogItemSaveReqVO createReqVO);

    /**
     * 添加内容节点
     * 
     * 业务规则：
     * 1. 父节点必须是 content_type='directory'
     * 2. 自动设置 content_type='content', allow_children=false
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long addContent(@Valid QuotaCatalogItemSaveReqVO createReqVO);

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

    /**
     * 检查节点是否有子节点
     *
     * @param id 节点ID
     * @return 是否有子节点
     */
    boolean hasChildren(Long id);
}
