package tech.easyflow.approval.service;

import tech.easyflow.approval.entity.ApprovalInstance;
import tech.easyflow.approval.entity.vo.ApprovalActionResult;
import tech.easyflow.approval.entity.vo.ApprovalSubmitRequest;

import java.math.BigInteger;

/**
 * 审批动作门面。
 */
public interface ApprovalActionFacade {

    /**
     * 提交审批。
     *
     * @param request 审批提交请求
     * @return 动作执行结果
     */
    ApprovalActionResult submit(ApprovalSubmitRequest request);

    /**
     * 处理审批通过后的业务回调。
     *
     * @param instance 审批实例
     * @param operatorId 操作人 ID
     * @param comment 审批意见
     */
    void handleApproved(ApprovalInstance instance, BigInteger operatorId, String comment);

    /**
     * 处理驳回后的业务回调。
     *
     * @param instance 审批实例
     * @param operatorId 操作人 ID
     * @param comment 审批意见
     */
    void handleRejected(ApprovalInstance instance, BigInteger operatorId, String comment);

    /**
     * 处理撤回后的业务回调。
     *
     * @param instance 审批实例
     * @param operatorId 操作人 ID
     * @param comment 审批意见
     */
    void handleRevoked(ApprovalInstance instance, BigInteger operatorId, String comment);

    /**
     * 校验已发布访问权限。
     *
     * @param resourceType 资源类型
     * @param identifier 资源标识
     * @param denyMessage 拒绝提示
     */
    void assertPublishedAccess(String resourceType, Object identifier, String denyMessage);
}
