package cn.nianxx.thhotel.workflows.reservation.service;

import cn.nianxx.thhotel.workflows.reservation.common.request.ManualReviewConversionRequest;
import cn.nianxx.thhotel.workflows.reservation.common.request.ManualReviewResolutionRequest;
import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationOperaSimulationRequest;
import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationTaskPayloadMutationRequest;
import cn.nianxx.thhotel.workflows.reservation.common.result.ManualReviewConversionResult;
import cn.nianxx.thhotel.workflows.reservation.common.result.ManualReviewResolutionResult;
import cn.nianxx.thhotel.workflows.reservation.common.result.ReservationOperaOperationResult;
import cn.nianxx.thhotel.workflows.reservation.common.result.ReservationTaskAuditListResult;
import cn.nianxx.thhotel.workflows.reservation.common.result.ReservationTaskDetailResult;
import cn.nianxx.thhotel.workflows.reservation.common.result.ReservationTaskPayloadMutationResult;

/**
 * Reservation 任务工作流服务。提供任务详情、队列可处理状态、人工复核转换和任务确认能力。
 */
public interface ReservationTaskWorkflowService {

    /**
     * 查询任务详情，并实时计算同订单前置任务阻塞状态。
     */
    ReservationTaskDetailResult getTaskDetail(Long taskId);

    /**
     * 将 Fallback / manual_review 任务人工转换为 New、Update 或 Cancel。
     */
    ManualReviewConversionResult convertManualReviewTask(Long taskId, ManualReviewConversionRequest request);

    /**
     * 保存任务卡草稿；只允许当前可编辑的 PENDING_CONFIRM 任务调用。
     */
    ReservationTaskPayloadMutationResult saveTaskDraft(Long taskId, ReservationTaskPayloadMutationRequest request);

    /**
     * 最终确认任务卡字段；校验通过后任务从 PENDING_CONFIRM 流转为 READY。
     */
    ReservationTaskPayloadMutationResult confirmTask(Long taskId, ReservationTaskPayloadMutationRequest request);

    /**
     * 在原业务任务卡上完成 type-known manual_review 复核，并将任务解阻为 READY。
     */
    ManualReviewResolutionResult resolveManualReview(Long taskId, ManualReviewResolutionRequest request);

    /**
     * 执行一条 OPERA 模拟操作；只允许前置模拟操作已成功的操作执行。
     */
    ReservationOperaOperationResult executeOperaOperation(
            Long taskId,
            Long operationId,
            ReservationOperaSimulationRequest request);

    /**
     * 重试失败的 OPERA 模拟操作；成功后继续保留 attempt 历史。
     */
    ReservationOperaOperationResult retryOperaOperation(
            Long taskId,
            Long operationId,
            ReservationOperaSimulationRequest request);

    /**
     * 查询任务审计流水。
     */
    ReservationTaskAuditListResult listTaskAudits(Long taskId);
}
