-- M002 SuperAgent 入站防重放：记录已使用 nonce，避免签名请求被重复提交。
CREATE TABLE integration_superagent_task_result_nonce (
    id BIGINT NOT NULL COMMENT 'Nonce 记录 ID',
    client_id VARCHAR(128) NOT NULL COMMENT 'SuperAgent 调用方客户端 ID',
    nonce VARCHAR(256) NOT NULL COMMENT '单次请求随机值，用于防重放',
    expires_at DATETIME(6) NOT NULL COMMENT 'Nonce 过期 UTC 时间',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_superagent_nonce_client_nonce (client_id, nonce),
    KEY idx_superagent_nonce_expires_at (expires_at)
) COMMENT='SuperAgent 任务结果入站 nonce 表，用于 HMAC 请求防重放';

-- M002 AI 任务结果接收批次：保存一次 SuperAgent 提交的顶层请求和幂等信息。
CREATE TABLE workflow_reservation_ai_batch (
    id BIGINT NOT NULL COMMENT 'AI 任务结果接收批次 ID',
    hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
    source_message_id BIGINT NOT NULL COMMENT '关联 SourceMessage Inbox ID',
    request_payload_sha256 CHAR(64) NOT NULL COMMENT '原始请求体 SHA-256，用于幂等和排查',
    batch_idempotency_key CHAR(64) NOT NULL COMMENT '系统生成批次幂等键',
    client_id VARCHAR(128) NOT NULL COMMENT 'SuperAgent 调用方客户端 ID',
    request_id VARCHAR(128) NULL COMMENT '调用方请求 ID，用于日志串联',
    received_at DATETIME(6) NOT NULL COMMENT '本系统接收 UTC 时间',
    item_count INT NOT NULL COMMENT '本批次 AI task result 数量',
    extraction_warnings_json LONGTEXT NULL COMMENT 'AI 抽取警告 JSON',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_reservation_ai_batch_idempotency (hotel_id, batch_idempotency_key),
    UNIQUE KEY uk_reservation_ai_batch_source (hotel_id, source_message_id),
    KEY idx_reservation_ai_batch_received_at (hotel_id, received_at)
) COMMENT='Reservation AI 任务结果接收批次表，保存 SuperAgent 入站请求的幂等和追溯信息';

-- M002 AI 过渡层：一条 ai_task_results item 对应一行，保留 AI 原始 JSON 和查询冗余列。
CREATE TABLE workflow_reservation_ai_transition (
    id BIGINT NOT NULL COMMENT 'AI 过渡记录 ID',
    hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
    batch_id BIGINT NOT NULL COMMENT 'AI 任务结果接收批次 ID',
    source_message_id BIGINT NOT NULL COMMENT '关联 SourceMessage Inbox ID',
    source_event_index INT NOT NULL COMMENT 'AI current 事件序号，按 AI 输出保存',
    array_index INT NOT NULL COMMENT 'AI 返回列表中的顺序，从 1 开始',
    execution_order INT NOT NULL COMMENT '映射到订单任务队列的初始顺序',
    catalog_code VARCHAR(32) NOT NULL COMMENT 'Skill 目录代码，例如 S01、S02',
    skill_id VARCHAR(128) NOT NULL COMMENT 'Skill 标识',
    result_type VARCHAR(32) NOT NULL COMMENT 'AI 结果类型，例如 normal_task、manual_review、informational_message',
    ai_task_type VARCHAR(64) NOT NULL COMMENT 'AI 原始任务类型，例如 New Booking、Voucher Received',
    system_task_type VARCHAR(64) NOT NULL COMMENT '系统主任务类型，例如 NEW_BOOKING、UPDATE_BOOKING',
    task_card_type VARCHAR(64) NOT NULL COMMENT '任务卡类型，例如 NEW_BOOKING、MESSAGE_NOTIFICATION',
    task_subtype VARCHAR(128) NULL COMMENT '业务动作 subtype',
    current_or_history VARCHAR(32) NULL COMMENT '当前或历史标识',
    group_code VARCHAR(128) NULL COMMENT 'Group Code 候选，来源于 case_keys 或卡片字段',
    confirmation_number VARCHAR(128) NULL COMMENT 'Confirmation Number 候选，来源于 case_keys 或卡片字段',
    item_payload_sha256 CHAR(64) NOT NULL COMMENT '单个 AI item JSON SHA-256',
    item_idempotency_key CHAR(64) NOT NULL COMMENT '系统生成 item 幂等键',
    manual_reason_code VARCHAR(128) NULL COMMENT 'manual_review 原因码',
    parent_source_event_index INT NULL COMMENT '父任务事件序号，用于联动任务',
    linked_task_group_id VARCHAR(128) NULL COMMENT '联动任务组 ID',
    blocked_until_parent_completed TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否等待父任务完成',
    ai_payload_json LONGTEXT NOT NULL COMMENT 'AI 原始 item JSON，禁止被用户修改覆盖',
    case_keys_json LONGTEXT NULL COMMENT '订单候选键 JSON',
    extracted_fields_json LONGTEXT NULL COMMENT 'AI 抽取业务字段 JSON',
    manual_review_json LONGTEXT NULL COMMENT '人工复核 JSON',
    informational_message_json LONGTEXT NULL COMMENT '信息提醒 JSON',
    attachments_json LONGTEXT NULL COMMENT '附件和文件引用 JSON',
    context_used_json LONGTEXT NULL COMMENT 'AI 使用上下文 JSON',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_reservation_ai_transition_item (hotel_id, item_idempotency_key),
    KEY idx_reservation_ai_transition_source_event (hotel_id, source_message_id, source_event_index),
    KEY idx_reservation_ai_transition_type (hotel_id, result_type, ai_task_type),
    KEY idx_reservation_ai_transition_group_code (hotel_id, group_code),
    KEY idx_reservation_ai_transition_confirmation (hotel_id, confirmation_number)
) COMMENT='Reservation AI 过渡表，保存每条 AI 任务结果的原始 JSON、映射类型和查询冗余列';

-- M002 订单：承载任务队列和临时订单归档容器。
CREATE TABLE workflow_reservation_order (
    id BIGINT NOT NULL COMMENT '系统内部订单 ID',
    hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
    order_key_type VARCHAR(32) NOT NULL COMMENT '业务号类型：GROUP_CODE、CONFIRMATION_NUMBER、TEMPORARY',
    order_business_key VARCHAR(128) NULL COMMENT '真实业务号，例如 Group Code 或 Confirmation Number',
    temporary_order_code VARCHAR(128) NOT NULL COMMENT '临时订单展示编号，即使有业务号也保留内部追踪编号',
    order_status VARCHAR(32) NOT NULL COMMENT '订单状态：TEMPORARY、ACTIVE、ENDED、LOGIC_DELETED',
    display_name VARCHAR(256) NOT NULL COMMENT '前端展示名称',
    source_message_id BIGINT NOT NULL COMMENT '首次创建该订单的来源消息 ID',
    created_from_task_id BIGINT NULL COMMENT '首次创建该订单的任务 ID，第一阶段允许为空',
    ended_at DATETIME(6) NULL COMMENT '订单进入 ENDED 状态的 UTC 时间',
    logic_deleted_at DATETIME(6) NULL COMMENT '逻辑删除 UTC 时间',
    logic_deleted_reason VARCHAR(512) NULL COMMENT '逻辑删除原因',
    version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_reservation_order_temp_code (hotel_id, temporary_order_code),
    KEY idx_reservation_order_status_time (hotel_id, order_status, updated_at),
    KEY idx_reservation_order_business_key (hotel_id, order_key_type, order_business_key)
) COMMENT='Reservation 订单表，承载业务订单号、临时订单和任务队列归属';

-- M002 任务：保存 AI 映射后的系统任务、队列顺序和处理状态。
CREATE TABLE workflow_reservation_task (
    id BIGINT NOT NULL COMMENT '系统任务 ID',
    hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
    order_id BIGINT NOT NULL COMMENT '当前挂靠订单 ID',
    source_message_id BIGINT NOT NULL COMMENT '来源消息 ID',
    ai_transition_id BIGINT NOT NULL COMMENT 'AI 过渡记录 ID',
    result_type VARCHAR(32) NOT NULL COMMENT 'AI 结果类型',
    ai_task_type VARCHAR(64) NOT NULL COMMENT 'AI 原始任务类型',
    system_task_type VARCHAR(64) NOT NULL COMMENT '系统主任务类型',
    task_card_type VARCHAR(64) NOT NULL COMMENT '任务卡类型',
    task_subtype VARCHAR(128) NULL COMMENT '业务动作 subtype',
    task_status VARCHAR(32) NOT NULL COMMENT '任务状态：PENDING_CONFIRM、READY、EXECUTING、FAILED、COMPLETED',
    queue_participation TINYINT(1) NOT NULL COMMENT '是否参与订单执行队列，Message Notification 为 0',
    execution_order INT NOT NULL COMMENT '同订单执行顺序',
    parent_task_id BIGINT NULL COMMENT '父任务 ID，用于联动任务',
    parent_source_event_index INT NULL COMMENT '父任务 source event index',
    linked_task_group_id VARCHAR(128) NULL COMMENT '联动任务组 ID',
    blocked_until_parent_completed TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否等待父任务完成',
    last_failure_reason VARCHAR(512) NULL COMMENT '最近失败原因摘要',
    completed_at DATETIME(6) NULL COMMENT '任务完成 UTC 时间',
    version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    KEY idx_reservation_task_order_queue (hotel_id, order_id, queue_participation, execution_order),
    KEY idx_reservation_task_status_time (hotel_id, task_status, updated_at),
    KEY idx_reservation_task_source (hotel_id, source_message_id),
    KEY idx_reservation_task_transition (hotel_id, ai_transition_id)
) COMMENT='Reservation 任务表，保存 AI 结果映射后的任务状态、任务卡类型和订单队列顺序';

-- M002 任务卡：CP1-3 只保存任务卡使用的 AI 原始 JSON 快照。
CREATE TABLE workflow_reservation_task_card (
    id BIGINT NOT NULL COMMENT '任务卡 ID',
    hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
    task_id BIGINT NOT NULL COMMENT '所属任务 ID',
    task_card_type VARCHAR(64) NOT NULL COMMENT '任务卡类型',
    field_contract_version VARCHAR(64) NOT NULL COMMENT '字段契约版本，第一版使用 code-v1',
    ai_payload_json LONGTEXT NOT NULL COMMENT '任务卡使用的 AI 原始 JSON 快照',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_reservation_task_card_task (hotel_id, task_id),
    KEY idx_reservation_task_card_type (hotel_id, task_card_type)
) COMMENT='Reservation 任务卡表，CP1-3 保存任务卡原始 AI 快照';
