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

import com.njcn.rdms.module.project.controller.admin.product.vo.member.ProductMemberBatchCreateReqVO;
import com.njcn.rdms.module.project.controller.admin.product.vo.member.ProductMemberBatchInactiveReqVO;
import com.njcn.rdms.module.project.controller.admin.product.vo.member.ProductMemberInactiveReqVO;
import com.njcn.rdms.module.project.controller.admin.product.vo.member.ProductMemberRespVO;
import com.njcn.rdms.module.project.controller.admin.product.vo.member.ProductMemberSaveReqVO;
import com.njcn.rdms.module.project.controller.admin.product.vo.member.ProductMemberUpdateReqVO;

import java.util.List;

/**
 * 产品团队 Service 接口
 */
public interface ProductMemberService {

    /**
     * 获取产品团队成员列表
     *
     * @param productId 产品编号
     * @return 成员列表
     */
    List<ProductMemberRespVO> getProductMemberList(Long productId);

    /**
     * 新增产品团队成员
     *
     * @param productId 产品编号
     * @param reqVO 请求参数
     * @return 团队关系编号
     */
    Long createProductMember(Long productId, ProductMemberSaveReqVO reqVO);

    /**
     * 批量新增产品团队成员（不承担经理交接语义；事务性入库，全部成功或整体回滚）。
     *
     * @param productId 产品编号
     * @param reqVO 请求参数
     * @return 新建的成员关系 ID 列表，顺序与入参 members 一致
     */
    List<Long> batchCreateProductMembers(Long productId, ProductMemberBatchCreateReqVO reqVO);

    /**
     * 调整产品团队成员角色
     *
     * @param productId 产品编号
     * @param memberId 成员关系编号
     * @param reqVO 请求参数
     */
    void updateProductMember(Long productId, Long memberId, ProductMemberUpdateReqVO reqVO);

    /**
     * 移出产品团队成员
     *
     * @param productId 产品编号
     * @param memberId 成员关系编号
     * @param reqVO 请求参数
     */
    void inactiveProductMember(Long productId, Long memberId, ProductMemberInactiveReqVO reqVO);

    /**
     * 批量移出产品团队成员（事务性更新，全部成功或整体回滚）。
     * <p>
     * 业务校验：同请求 memberId 重复、不存在/不属于当前产品、已失效、产品经理均拒绝；
     * 经理判定与单条 inactive 一致，按 product.managerUserId 比对。
     *
     * @param productId 产品编号
     * @param reqVO 请求参数
     */
    void batchInactiveProductMembers(Long productId, ProductMemberBatchInactiveReqVO reqVO);

}
