package com.njcn.rdms.module.project.service.product;

import com.njcn.rdms.framework.common.pojo.PageResult;
import com.njcn.rdms.module.project.controller.admin.product.vo.requirement.*;

import java.util.List;

/**
 * 产品需求 Service 接口
 */
public interface ProductRequirementService {

    /**
     * 创建产品需求
     *
     * @param createReqVO 创建请求
     * @return 需求编号
     */
    Long createRequirement(ProductRequirementSaveReqVO createReqVO);

    /**
     * 更新产品需求（不含状态变更）
     *
     * @param updateReqVO 更新请求
     */
    void updateRequirement(ProductRequirementUpdateReqVO updateReqVO);

    /**
     * 获取需求详情
     *
     * @param id 需求编号
     * @return 需求详情
     */
    ProductRequirementRespVO getRequirement(Long id, Long productId);

    /**
     * 获取需求分页列表
     *
     * @param pageReqVO 分页请求
     * @return 分页结果
     */
    PageResult<ProductRequirementRespVO> getRequirementPage(ProductRequirementPageReqVO pageReqVO);

    /**
     * 获取需求树形列表（分页）
     *
     * @param pageReqVO 分页请求
     * @return 分页结果（只按父需求分页，子需求不计入分页）
     */
    PageResult<ProductRequirementRespVO> getRequirementTree(ProductRequirementPageReqVO pageReqVO);

    /**
     * 变更需求状态
     *
     * @param reqVO 状态动作请求
     */
    void changeRequirementStatus(ProductRequirementStatusActionReqVO reqVO);

    /**
     * 删除需求
     *
     * @param id        需求编号
     * @param productId 产品编号
     */
    void deleteRequirement(Long id, Long productId);

    /**
     * 拆分需求（创建子需求）
     *
     * @param reqVO 拆分请求
     * @return 子需求编号
     */
    Long splitRequirement(ProductRequirementSplitReqVO reqVO);

    /**
     * 关闭需求（大需求关闭时级联关闭子需求）
     *
     * @param reqVO 关闭请求
     */
    void closeRequirement(ProductRequirementCloseReqVO reqVO);

    /**
     * 获取需求当前可执行的状态动作列表
     *
     * @param requirementId 需求编号
     * @param productId     产品编号
     * @return 可执行动作列表
     */
    List<ProductRequirementStatusTransitionRespVO> getAllowedTransitions(Long requirementId, Long productId);

    /**
     * 获取需求生命周期信息（当前状态 + 可执行动作）
     *
     * @param requirementId 需求编号
     * @param productId     产品编号
     * @return 生命周期信息
     */
    ProductRequirementLifecycleRespVO getRequirementLifecycle(Long requirementId, Long productId);

    // ========== 模块管理 ==========

    /**
     * 创建需求模块
     *
     * @param reqVO 模块保存请求
     * @return 模块编号
     */
    Long createRequirementModule(ProductRequirementModuleReqVO reqVO);

    /**
     * 更新需求模块
     *
     * @param reqVO 模块保存请求
     */
    void updateRequirementModule(ProductRequirementModuleReqVO reqVO);

    /**
     * 删除需求模块（级联删除模块下需求）
     *
     * @param moduleId  模块编号
     * @param productId 产品编号
     */
    void deleteRequirementModule(Long moduleId, Long productId);

    /**
     * 获取需求模块树
     *
     * @param productId 产品编号
     * @return 模块树
     */
    List<ProductRequirementModuleRespVO> getRequirementModuleTree(Long productId);

    /**
     * 获取需求所有状态字典列表
     *
     * @return 状态字典列表
     */
    List<ProductRequirementStatusDictRespVO> getRequirementStatusDict();

    /**
     * 获取需求终止态状态字典列表
     *
     * @return 终止态状态字典列表
     */
    List<ProductRequirementStatusDictRespVO> getRequirementTerminalStatusDict();

}
