import type { ChatMessage, ChatQuickReply } from './chat-message';
/**
 * 提交消息时传给 adapter.submit 的参数
 */
export interface ChatSubmitInput {
    /** 用户输入的 prompt 文本 */
    userPrompt: string;
    /**
     * 当前会话 ID
     * - 首次会话传 `null`
     * - 续聊场景传上一次 submit 返回的 conversationId
     */
    conversationId: string | null;
    /**
     * 业务上下文，来自 `CnAiChatShellProps.context`，
     * adapter 内部可按需类型断言为具体业务结构
     */
    context?: Record<string, any>;
}
/**
 * adapter.submit 返回结果
 */
export interface ChatSubmitResult {
    /** 后端返回的会话 ID，后续轮询和续聊时使用 */
    conversationId: string;
    /** 后端返回的响应消息 ID，传给 adapter.query 用于轮询 */
    respMessageId: string;
}
/**
 * 轮询时传给 adapter.query 的参数
 */
export interface ChatQueryInput {
    /** 会话 ID（来自 ChatSubmitResult） */
    conversationId: string;
    /** 响应消息 ID（来自 ChatSubmitResult） */
    messageId: string;
}
/**
 * adapter.query 返回结果
 */
export interface ChatQueryResult {
    /** 当前已生成的文本内容（支持 Markdown） */
    text: string;
    /**
     * 是否仍在生成中
     * - `true`：继续轮询
     * - `false`：生成完成，停止轮询
     */
    onGoing: boolean;
    /**
     * 业务扩展元数据
     * 由 adapter 从后端透传，会被浅合并到对应 assistant 消息的 meta 字段中。
     * 例如 `{ standardModified: true }` 可供上层读取。
     */
    meta?: Record<string, unknown>;
    /**
     * 快捷回复按钮
     * 仅在 onGoing=false（生成完成）时返回才有意义，
     * 会被合并到 assistant 消息的 quickReplies 字段。
     */
    quickReplies?: ChatQuickReply[];
}
/**
 * 查询历史消息时传给 adapter.queryHistory 的参数
 */
export interface ChatHistoryQueryInput {
    /** 当前会话 ID */
    conversationId: string;
    /** 分页游标，首次请求不传或传 undefined，后续传上一次返回的 nextCursor */
    cursor?: string;
    /** 每页数量，不传时由组件侧使用 historyPageSize 默认值 */
    pageSize?: number;
    /** 业务上下文，来自 CnAiChatShellProps.context */
    context?: Record<string, any>;
}
/**
 * adapter.queryHistory 返回结果
 */
export interface ChatHistoryQueryResult {
    /** 本次返回的历史消息列表（时间升序，即最早的在前） */
    messages: ChatMessage[];
    /** 下一页游标，无更多数据时为 undefined 或不传 */
    nextCursor?: string;
    /** 是否还有更早的历史消息 */
    hasMore: boolean;
}
/**
 * 聊天适配器接口
 *
 * 不同业务场景（AI Agent、智能跟单等）通过实现此接口接入 CnAiChatShell，
 * 组件内部不直接依赖任何业务 URL。
 *
 * @example
 * ```ts
 * const adapter: ChatAdapter = {
 *   submit: async (input) => {
 *     const res = await myApi.submit(input.userPrompt);
 *     return { conversationId: res.cid, respMessageId: res.mid };
 *   },
 *   query: async (input) => {
 *     const res = await myApi.query(input.conversationId, input.messageId);
 *     return { text: res.text, onGoing: res.onGoing };
 *   },
 * };
 * ```
 */
export interface ChatAdapter {
    /**
     * 提交用户消息到后端
     * @param input 提交参数
     * @returns 包含 conversationId 和 respMessageId 的结果
     * @throws 提交失败时应抛出异常，组件会自动处理错误展示
     */
    submit: (input: ChatSubmitInput) => Promise<ChatSubmitResult>;
    /**
     * 轮询查询 AI 回复
     * @param input 查询参数
     * @returns 当前生成进度和文本
     * @throws 查询失败时应抛出异常，组件会自动处理错误展示
     */
    query: (input: ChatQueryInput) => Promise<ChatQueryResult>;
    /**
     * 中止当前请求（可选）
     * 用于中断正在进行的网络请求（如 AbortController）
     */
    abort?: () => void;
    /**
     * 初始化会话（可选）
     * 某些场景（如智能跟单）首次进入时需要由系统发起一次初始化请求，
     * 返回 conversationId 后即可开始轮询。
     * @param context 业务上下文
     */
    init?: (context?: Record<string, any>) => Promise<ChatSubmitResult | void>;
    /**
     * 查询历史消息（可选）
     * 实现后配合 `enableHistory=true` 使用，滚动到顶部时自动调用拉取更早消息。
     * @param input 分页查询参数
     * @returns 历史消息列表及分页信息
     */
    queryHistory?: (input: ChatHistoryQueryInput) => Promise<ChatHistoryQueryResult>;
}
