package tech.easyflow.approval.service;

import com.mybatisflex.core.paginate.Page;
import tech.easyflow.approval.entity.ApprovalTask;
import tech.easyflow.approval.entity.vo.ApprovalAssigneeOptionVo;
import tech.easyflow.approval.entity.vo.ApprovalFlowStepVo;

import java.math.BigInteger;
import java.util.List;
import java.util.Set;

/**
 * 审批对象服务。
 */
public interface ApprovalAssigneeService {

    /**
     * 规范化并校验审批步骤中的审批对象配置。
     *
     * @param step 步骤配置
     * @return 规范化后的步骤配置
     */
    ApprovalFlowStepVo normalizeStepAssignee(ApprovalFlowStepVo step);

    /**
     * 查询可用角色选项。
     *
     * @return 角色选项
     */
    List<ApprovalAssigneeOptionVo> listRoleOptions();

    /**
     * 分页查询可用用户选项。
     *
     * @param keyword 关键词
     * @param pageNumber 页码
     * @param pageSize 每页数量
     * @return 用户选项分页
     */
    Page<ApprovalAssigneeOptionVo> pageAccountOptions(String keyword, Long pageNumber, Long pageSize);

    /**
     * 查询指定账号当前仍有效的角色 ID 集合。
     *
     * @param accountId 账号 ID
     * @return 角色 ID 集合
     */
    Set<BigInteger> getAvailableRoleIds(BigInteger accountId);

    /**
     * 判断当前账号是否命中审批任务。
     *
     * @param task 审批任务
     * @param operatorId 当前操作人
     * @param roleIds 当前操作人的有效角色集合
     * @return 是否命中
     */
    boolean canHandleTask(ApprovalTask task, BigInteger operatorId, Set<BigInteger> roleIds);

    /**
     * 查询当前账号命中的待审批实例 ID 集合。
     *
     * @param operatorId 当前操作人
     * @param roleIds 当前操作人的有效角色集合
     * @param instanceIds 可选的实例 ID 过滤条件
     * @return 命中的实例 ID 集合
     */
    Set<BigInteger> listPendingInstanceIds(BigInteger operatorId, Set<BigInteger> roleIds, List<BigInteger> instanceIds);
}
