package com.njcn.rdms.module.project.controller.admin.project.vo.project;

import com.njcn.rdms.module.project.controller.admin.project.vo.member.ProjectMemberSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.util.List;

/**
 * 项目创建原子接口请求 VO（POST /project/project/create-with-team）。
 *
 * <p>由前端"项目两步向导"一次性提交：项目基础资料 + 初始团队成员。
 * 后端必须在同一事务内完成全部写入，任一步失败整体回滚。
 */
@Schema(description = "管理后台 - 项目创建（含初始团队）Request VO")
@Data
public class ProjectCreateWithTeamReqVO {

    /**
     * 项目基础资料。沿用 {@link ProjectSaveReqVO} 字段约束（同 POST /create）。
     * 新增场景前端不传 {@code actualStartDate / actualEndDate}（实际日期由项目执行阶段才有值）。
     */
    @Schema(description = "项目基础资料", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "项目基础资料不能为空")
    @Valid
    private ProjectSaveReqVO project;

    /**
     * 初始团队成员列表。
     *
     * <p>必须包含一条 {@code userId == project.managerUserId} 的项目经理成员，
     * 由前端在打开第 2 步时按 role code = {@code project_manager} 反查 roleId 后聚合提交。
     * 后端不再根据 {@code project.managerUserId} 自动追加经理成员。
     */
    @Schema(description = "初始团队成员（含项目经理本人）", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "初始团队成员不能为空")
    @Valid
    private List<ProjectMemberSaveReqVO> members;

    /**
     * 关心人 user ID 列表（创建时手动添加，可选）。
     *
     * <p>跟 members 是平行字段：watcher 不参与团队管理，只是被授予"项目关心人"角色（project_watcher）拿
     * 数据可见性。允许跟 members 的 user 重叠（多角色合法）；后端按 (user, object, role) 三元组写入，
     * 重复跳过 / INACTIVE 复活，业务侧不强校验。
     */
    @Schema(description = "关心人用户ID列表（可选，可与团队成员重叠）", example = "101,102")
    private List<Long> watcherUserIds;

}
