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

import com.njcn.rdms.framework.common.pojo.PageResult;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectContextRespVO;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectCreateWithTeamReqVO;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectDeleteReqVO;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectOverviewSummaryRespVO;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectPageReqVO;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectRespVO;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectSaveReqVO;
import com.njcn.rdms.module.project.controller.admin.project.vo.project.ProjectStatusActionReqVO;
import com.njcn.rdms.module.project.dal.dataobject.project.ProjectDO;

import java.util.List;

/**
 * 项目 Service 接口
 */
public interface ProjectService {

    Long createProject(ProjectSaveReqVO createReqVO);

    /**
     * 创建项目并初始化团队（原子接口）。
     *
     * <p>由前端"项目两步向导"一次性提交，项目基础资料与全部初始团队成员
     * 必须在同一事务内完成写入；任一步失败整体回滚。
     *
     * <p>与 {@link #createProject(ProjectSaveReqVO)} 的关键差异：
     * <ul>
     *   <li>经理成员由前端在 {@code members} 中显式提交，后端不再根据
     *       {@code project.managerUserId} 自动追加；并校验 {@code members}
     *       中必须存在 userId 等于 managerUserId 的记录；</li>
     *   <li>{@code productId} 非空时，{@code directionCode} 必须与所属产品方向
     *       一致（防御性校验），不一致直接报错而非覆盖。</li>
     * </ul>
     *
     * @param reqVO 创建请求（项目 + 初始团队）
     * @return 项目编号
     */
    Long createProjectWithTeam(ProjectCreateWithTeamReqVO reqVO);

    void updateProject(ProjectSaveReqVO updateReqVO);

    ProjectDO getProject(Long id);

    ProjectRespVO getProjectDetail(Long id);

    List<ProjectRespVO> getProjectListByProductId(Long productId);

    ProjectContextRespVO getProjectContext(Long id);

    PageResult<ProjectDO> getProjectPage(ProjectPageReqVO pageReqVO);

    ProjectOverviewSummaryRespVO getProjectOverviewSummary();

    void changeProjectStatus(ProjectStatusActionReqVO reqVO);

    void deleteProject(ProjectDeleteReqVO reqVO);

    void autoStartProjectIfPending(Long projectId, String triggerAction);

}
