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

import java.util.List;

/**
 * 对象角色自动分配服务：新建产品 / 项目时按规则自动写 rdms_user_object_role。
 *
 * 写入规则（参 spec 7.1 节）：
 * - 创建者 = 责任人时，仍写 2 条 (user 同, role 不同)，让 creator 信息不丢
 * - 创建者 ≠ 责任人时，写 2 条 (user 不同, role 不同)
 *
 * watcher 批量写入参 spec 7.2 节，允许 watcher 跟 manager 是同一 user。
 *
 * 使用复活语义：(user, object, role) 三元组若存在 INACTIVE 行 → update 复活；
 * 不存在 → INSERT；已 ACTIVE → 跳过。
 */
public interface ObjectRoleAutoAssignService {

    /**
     * 自动落地 creator + manager 双角色记录（一次性写两条，给 fresh 创建流程使用）。
     *
     * @param objectType        "product" 或 "project"
     * @param objectId          新建对象 ID
     * @param creatorUserId     创建者 user ID（一般取 LoginUser）
     * @param managerUserId     责任人 user ID
     * @param creatorRoleCode   creator 角色 code（product_creator / project_creator）
     * @param managerRoleCode   manager 角色 code（product_manager / project_manager）
     */
    void assignCreatorAndManager(String objectType, Long objectId,
                                 Long creatorUserId, Long managerUserId,
                                 String creatorRoleCode, String managerRoleCode);

    /**
     * 自动落地 creator 单角色记录（manager 由现有业务流程已经写好的场景使用）。
     *
     * @param objectType        "product" 或 "project"
     * @param objectId          新建对象 ID
     * @param creatorUserId     创建者 user ID
     * @param creatorRoleCode   creator 角色 code
     */
    void assignCreator(String objectType, Long objectId, Long creatorUserId, String creatorRoleCode);

    /**
     * 自动落地 watcher 角色记录（批量、自动去重；空列表直接返回）。
     *
     * @param objectType        "product" 或 "project"
     * @param objectId          对象 ID
     * @param watcherUserIds    关心人 user ID 列表（可空 / 重复，会去重）
     * @param watcherRoleCode   watcher 角色 code（product_watcher / project_watcher）
     */
    void assignWatchers(String objectType, Long objectId,
                        List<Long> watcherUserIds, String watcherRoleCode);

}
