package cn.nianxx.thhotel.workflows.reservation.common.result;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.OffsetDateTime;
import java.util.List;

/**
 * query_case_context 返回数据。只表达订单、任务和终止事实，不输出最终业务结论。
 *
 * @param matchedOrderRecords 按查询 key 匹配到的订单摘要
 * @param pendingOrOpenTasks 同 key 或同订单下尚未结束的任务摘要
 * @param activeWorkflows 活跃工作流摘要，第一版无独立 workflow 表所以固定为空列表
 * @param terminatedRecords 影响 Skill 判断的终止订单或终止任务事实
 * @param targetObjectValidation 后端基于事实给出的目标对象校验摘要
 * @param keyRelationships Group Code 与 Confirmation Number 的关系证据
 */
public record ReservationAiCaseContextResult(
        @JsonProperty("matched_order_records")
        List<MatchedOrderRecord> matchedOrderRecords,
        @JsonProperty("pending_or_open_tasks")
        List<PendingOrOpenTask> pendingOrOpenTasks,
        @JsonProperty("active_workflows")
        List<ActiveWorkflow> activeWorkflows,
        @JsonProperty("terminated_records")
        List<TerminatedRecord> terminatedRecords,
        @JsonProperty("target_object_validation")
        TargetObjectValidation targetObjectValidation,
        @JsonProperty("key_relationships")
        KeyRelationships keyRelationships
) {

    /**
     * 订单匹配摘要。object_id 使用 ORDER:{orderId}，便于 object-detail 接口继续查询。
     *
     * @param objectId 查询对象 ID
     * @param objectType 查询对象类型
     * @param orderId 本系统订单 ID
     * @param orderKeyType 订单业务号类型
     * @param groupCode Group Code
     * @param confirmationNumber Confirmation Number
     * @param temporaryOrderCode 临时订单号
     * @param displayName 用户可读展示名
     * @param status 订单状态
     * @param businessKeySource 业务号来源
     * @param sourceTable 来源表名
     * @param lastUpdatedAt 最近更新时间
     */
    public record MatchedOrderRecord(
            @JsonProperty("object_id")
            String objectId,
            @JsonProperty("object_type")
            String objectType,
            @JsonProperty("order_id")
            String orderId,
            @JsonProperty("order_key_type")
            String orderKeyType,
            @JsonProperty("group_code")
            String groupCode,
            @JsonProperty("confirmation_number")
            String confirmationNumber,
            @JsonProperty("temporary_order_code")
            String temporaryOrderCode,
            @JsonProperty("display_name")
            String displayName,
            String status,
            @JsonProperty("business_key_source")
            String businessKeySource,
            @JsonProperty("source_table")
            String sourceTable,
            @JsonProperty("last_updated_at")
            OffsetDateTime lastUpdatedAt
    ) {
    }

    /**
     * 未完成任务摘要。FAILED 和 COMPLETED 不进入该列表，避免误阻塞后续任务。
     *
     * @param taskId 本系统任务 ID
     * @param orderId 任务当前挂靠订单 ID
     * @param sourceMessageId 任务来源消息 ID
     * @param sourceEventIndex AI current 事件序号
     * @param catalogCode Skill 目录代码
     * @param skillId Skill 标识
     * @param resultType AI 结果类型
     * @param taskType AI 原始任务类型
     * @param systemTaskType 系统主任务类型
     * @param taskCardType 任务卡类型
     * @param taskSubtype 业务动作 subtype
     * @param taskStatus 任务状态
     * @param queueParticipation 是否参与订单执行队列
     * @param executionOrder 同订单执行顺序
     * @param parentTaskId 父任务 ID
     * @param parentSourceEventIndex 父事件序号
     * @param linkedTaskGroupId 联动任务组 ID
     * @param blockedUntilParentCompleted 是否等待父任务完成
     * @param lastUpdatedAt 最近更新时间
     */
    public record PendingOrOpenTask(
            @JsonProperty("task_id")
            String taskId,
            @JsonProperty("order_id")
            String orderId,
            @JsonProperty("source_message_id")
            String sourceMessageId,
            @JsonProperty("source_event_index")
            Integer sourceEventIndex,
            @JsonProperty("catalog_code")
            String catalogCode,
            @JsonProperty("skill_id")
            String skillId,
            @JsonProperty("result_type")
            String resultType,
            @JsonProperty("task_type")
            String taskType,
            @JsonProperty("system_task_type")
            String systemTaskType,
            @JsonProperty("task_card_type")
            String taskCardType,
            @JsonProperty("task_subtype")
            String taskSubtype,
            @JsonProperty("task_status")
            String taskStatus,
            @JsonProperty("queue_participation")
            Boolean queueParticipation,
            @JsonProperty("execution_order")
            Integer executionOrder,
            @JsonProperty("parent_task_id")
            String parentTaskId,
            @JsonProperty("parent_source_event_index")
            Integer parentSourceEventIndex,
            @JsonProperty("linked_task_group_id")
            String linkedTaskGroupId,
            @JsonProperty("blocked_until_parent_completed")
            Boolean blockedUntilParentCompleted,
            @JsonProperty("last_updated_at")
            OffsetDateTime lastUpdatedAt
    ) {
    }

    /**
     * 活跃工作流占位结构。当前系统没有独立 workflow 表，所以接口只返回空列表。
     */
    public record ActiveWorkflow() {
    }

    /**
     * 终止事实摘要。用于让 Skill 看到 ENDED、LOGIC_DELETED、FAILED 和 COMPLETED。
     *
     * @param recordType 终止事实类型，order 或 task
     * @param recordId 终止记录 ID
     * @param status 终止状态
     * @param reason 终止原因
     * @param occurredAt 终止发生时间
     * @param lastUpdatedAt 最近更新时间
     */
    public record TerminatedRecord(
            @JsonProperty("record_type")
            String recordType,
            @JsonProperty("record_id")
            String recordId,
            String status,
            String reason,
            @JsonProperty("occurred_at")
            OffsetDateTime occurredAt,
            @JsonProperty("last_updated_at")
            OffsetDateTime lastUpdatedAt
    ) {
    }

    /**
     * 目标对象校验摘要。字段名保持导入契约语义，但不替代 Skill 的最终判断。
     *
     * @param status 校验状态，none、single、multiple 或 conflict
     * @param matchedObjectId 唯一匹配对象 ID
     * @param matchedObjectType 唯一匹配对象类型
     * @param canCreateNewBookingTask 是否允许继续创建 New Booking 任务
     * @param canCreateUpdateTask 是否允许创建 Update Booking 任务
     * @param canCreateCancelTask 是否允许创建 Cancel Booking 任务
     * @param canAttachVoucher 是否允许绑定 voucher 类任务
     * @param canAttachRoomingList 是否允许绑定 rooming list 类任务
     * @param needsManualReviewReason 需要人工复核的原因码
     */
    public record TargetObjectValidation(
            String status,
            @JsonProperty("matched_object_id")
            String matchedObjectId,
            @JsonProperty("matched_object_type")
            String matchedObjectType,
            @JsonProperty("can_create_new_booking_task")
            Boolean canCreateNewBookingTask,
            @JsonProperty("can_create_update_task")
            Boolean canCreateUpdateTask,
            @JsonProperty("can_create_cancel_task")
            Boolean canCreateCancelTask,
            @JsonProperty("can_attach_voucher")
            Boolean canAttachVoucher,
            @JsonProperty("can_attach_rooming_list")
            Boolean canAttachRoomingList,
            @JsonProperty("needs_manual_review_reason")
            String needsManualReviewReason
    ) {
    }

    /**
     * 业务 key 关系。当前系统没有关系投影，多数场景保持 null。
     *
     * @param groupCodeAndConfirmationSameObject 是否可证明两个 key 属于同一对象
     * @param relationshipEvidence 关系判断证据说明
     */
    public record KeyRelationships(
            @JsonProperty("group_code_and_confirmation_same_object")
            Boolean groupCodeAndConfirmationSameObject,
            @JsonProperty("relationship_evidence")
            String relationshipEvidence
    ) {
    }
}
