import type Koa from "koa";
import type { VextResponse } from "../../types/response.js";
/**
 * Koa Context → VextResponse 转换
 *
 * 核心设计（与 Hono / Fastify / Express Adapter 的 response.ts 逻辑对齐）：
 *
 *   1. 延迟绑定 requestId（getRequestId getter）
 *      requestId 在 createVextResponse 调用时尚未生成（requestId 中间件还没执行），
 *      传入 getter 函数确保 json() 实际调用时才取值（此时 requestId 必然已由中间件生成）。
 *
 *   2. 内建出口包装（_wrapEnabled 标志）
 *      response-wrapper 中间件通过 _enableWrap() 开启包装标志。
 *      json() 根据标志决定是否将响应体包装为 { code: 0, data, requestId }。
 *      rawJson() 始终绕过包装——仅供框架内部错误处理使用。
 *
 *   3. 重复发送保护（_sent 标志）
 *      防止 handler 中误调用多次 res.json()，dev 模式打印警告，生产模式静默忽略。
 *
 *   4. 链式调用（status / setHeader 返回 this）
 *      res.status(201).json(data) 正确设置 HTTP 201。
 *
 *   5. 204 No Content 合规（RFC 9110 §15.3.5）
 *      无论包装是否开启，204 均发送无消息体的响应。
 *
 *   6. 手动 JSON 序列化
 *      使用 ctx.res.end(JSON.stringify(...)) 而非 ctx.body = object，
 *      避免 Koa 内置的响应体处理（自动 Content-Type 推断、自动 JSON 序列化），
 *      保证与 Hono / Fastify / Express Adapter 行为一致（跨 Adapter 行为一致性 > 单 Adapter 便利性）。
 *
 * 与其他 Adapter 的差异：
 *   - Hono: 通过 ResponseBox 容器捕获 c.json() 返回的 Web Response 对象
 *   - Fastify: 直接调用 reply.status().header().send() 发送响应
 *   - Express: 直接调用 expressRes.statusCode + setHeader() + end() 发送响应
 *   - Koa: 通过 ctx.res（Node.js 原生 ServerResponse）直接操作，
 *     绕过 Koa 的 ctx.body / ctx.status 赋值模式，避免 Koa 后续的响应体自动处理
 *     与 vext 的手动控制产生冲突。
 *
 * 时序保证：
 *   createVextResponse(ctx, () => req.requestId)
 *     ↓ executeChain 开始
 *   [requestIdMiddleware]        → req.requestId = 'a1b2c3d4...'
 *   [responseWrapperMiddleware]  → res._enableWrap()
 *     ↓
 *   [handler] res.status(201).json(data)
 *     → _wrapEnabled = true
 *     → getRequestId() → 'a1b2c3d4...'（已设置）
 *     → ctx.res.end(JSON.stringify({ code: 0, data, requestId }))
 *     → HTTP 201 ✅
 *
 * @param ctx            Koa Context 对象
 * @param getRequestId   延迟获取 requestId 的 getter 函数
 * @returns VextResponse 实例（含内部方法 _enableWrap）
 *
 * @see adapters/hono/response.ts（Hono Adapter 对应实现）
 * @see adapters/fastify/response.ts（Fastify Adapter 对应实现）
 * @see adapters/express/response.ts（Express Adapter 对应实现）
 */
export declare function createVextResponse(ctx: Koa.Context, getRequestId: () => string): VextResponse;
