import type React from 'react';
import type { ChatMessage } from './chat-message';
import type { ChatAdapter } from './chat-adapter';
import type { ChatPollingConfig } from './cn-ai-chat-shell';
import type { ChatShellEvent } from './chat-event';
/**
 * `useChatPolling` Hook 的初始化选项
 */
export interface UseChatPollingOptions {
    /** 业务适配器，提供 query 方法 */
    adapter: ChatAdapter;
    /** 轮询配置（间隔、上限、超时文案） */
    pollingConfig?: ChatPollingConfig;
    /** 事件回调，轮询过程中触发 poll_tick / poll_timeout / error */
    onEvent?: (event: ChatShellEvent) => void;
}
/**
 * 单次轮询任务的启动参数
 */
export interface PollParams {
    /** 会话 ID */
    conversationId: string;
    /** 响应消息 ID */
    messageId: string;
    /** 消息列表中占位消息的 ID，用于定位并更新内容 */
    placeholderMessageId: string;
    /** 更新消息列表的 state setter */
    setMessages: React.Dispatch<React.SetStateAction<ChatMessage[]>>;
    /** 轮询结束时的回调（成功/超时/失败均会调用） */
    onDone: () => void;
    /**
     * 请求令牌（递增整数）
     * 用于竞态保护：新请求发起后，旧轮询返回时检查 token 是否匹配，
     * 不匹配则丢弃结果，防止消息错位。
     */
    requestToken: number;
}
/**
 * `useChatRuntime` Hook 的初始化选项
 */
export interface UseChatRuntimeOptions {
    /** 业务适配器 */
    adapter: ChatAdapter;
    /** 业务上下文，每次 submit 时透传给 adapter */
    context?: Record<string, any>;
    /**
     * 初始会话 ID（续聊场景）
     * 传入后首次 submit 会携带此 ID
     */
    initialConversationId?: string | null;
    /** 轮询配置 */
    pollingConfig?: ChatPollingConfig;
    /** 事件回调 */
    onEvent?: (event: ChatShellEvent) => void;
    /**
     * 受控消息列表
     * 传入时组件进入受控模式，内部不维护消息 state
     */
    controlledMessages?: ChatMessage[];
    /**
     * 消息列表变化回调
     * - 受控模式：每次消息更新时调用，外部据此更新 state
     * - 非受控模式：可选监听，用于同步外部状态
     */
    onMessagesChange?: (messages: ChatMessage[]) => void;
    /**
     * 是否在挂载后自动调用 adapter.init(context) 初始化会话
     * @default false
     */
    autoInit?: boolean;
    /**
     * autoInit 前置条件
     * 当提供该值时，仅在其为 truthy 时才触发自动初始化。
     * 适用于上下文异步就绪的场景（如 tableId 尚未加载完成）。
     * 不传或传 undefined 表示无前置条件，立即初始化。
     */
    initWhen?: boolean;
    /** 是否启用历史消息加载 */
    enableHistory?: boolean;
    /** 历史消息每页数量 */
    historyPageSize?: number;
}
