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

import com.njcn.rdms.module.project.controller.admin.product.vo.member.ProductMemberSaveReqVO;
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/product/create-with-team）。
 *
 * <p>由前端"产品两步向导"一次性提交：产品基础资料 + 初始团队成员。
 * 后端必须在同一事务内完成全部写入，任一步失败整体回滚。
 */
@Schema(description = "管理后台 - 产品创建（含初始团队）Request VO")
@Data
public class ProductCreateWithTeamReqVO {

    /**
     * 产品基础资料。沿用 {@link ProductSaveReqVO} 字段约束（同 POST /create）。
     */
    @Schema(description = "产品基础资料", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "产品基础资料不能为空")
    @Valid
    private ProductSaveReqVO product;

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

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

}
