import * as React from 'react';
import type { CnSenderProps } from '../../cn-sender/view/types/cn-sender-props';
import type { ChatMessage, ChatQuickReply } from './chat-message';
import type { ChatAdapter } from './chat-adapter';
import type { ChatShellEvent } from './chat-event';
/**
 * autoInit 流程的生命周期状态
 * - `idle`：未启用 autoInit 或尚未开始
 * - `pending`：init 请求进行中
 * - `success`：init 成功，已获得 conversationId 并开始轮询
 * - `failed`：init 失败
 */
export type InitStatus = 'idle' | 'pending' | 'success' | 'failed';
/**
 * 轮询行为配置项
 * 未传入时使用 constants.ts 中的默认值
 */
export interface ChatPollingConfig {
    /**
     * 轮询间隔时间（毫秒）
     * @default 2000
     */
    interval?: number;
    /**
     * 最大轮询次数，超过后判定为超时
     * @default 90（即 2s × 90 = 3 分钟）
     */
    maxCount?: number;
    /**
     * 超时后展示的提示文案
     * @default '查询超时，请稍后重试。'
     */
    timeoutText?: string;
}
/**
 * CnAiChatShell 组件属性
 *
 * 通用聊天壳组件，不直接耦合具体业务接口。
 * 内部集成 CnSender 输入框、消息列表、轮询状态机。
 * 业务差异通过 `adapter` + `context` + 渲染插槽注入。
 *
 * @example
 * ```tsx
 * <CnAiChatShell
 *   adapter={myAdapter}
 *   context={{ tableId: '123' }}
 *   senderProps={{ placeholder: '输入问题…', allowRecord: true }}
 *   onEvent={(e) => console.log(e.name)}
 * />
 * ```
 */
export interface CnAiChatShellProps extends React.HTMLAttributes<HTMLDivElement> {
    /**
     * 业务适配器（必传）
     * 封装 submit / query 逻辑，不同业务场景提供不同实现
     */
    adapter: ChatAdapter;
    /**
     * 业务上下文
     * 每次 submit 时透传给 adapter.submit(input.context)，
     * adapter 内部可按需类型断言为具体业务结构
     */
    context?: Record<string, any>;
    /**
     * 初始会话 ID（续聊场景）
     * 传入后首次 submit 会携带此 ID，适用于页面刷新后恢复会话
     */
    initialConversationId?: string | null;
    /**
     * 轮询行为配置
     * 可覆盖默认的轮询间隔、最大次数、超时文案
     */
    pollingConfig?: ChatPollingConfig;
    /**
     * CnSender 透传属性
     * 不含 onSubmit / loading / onCancel（由组件内部接管）
     * @see CnSenderProps
     */
    senderProps?: Omit<CnSenderProps, 'onSubmit' | 'loading' | 'onCancel'>;
    /**
     * 事件回调
     * 组件生命周期关键节点触发，可用于埋点、日志等
     */
    onEvent?: (event: ChatShellEvent) => void;
    /**
     * 是否在挂载后自动调用 `adapter.init(context)` 完成会话初始化
     * - `true`：mount 后自动 init，init 期间根据 `disableSenderBeforeInit` 决定是否阻断输入
     * - `false`（默认）：不触发 init，保持原有行为
     */
    autoInit?: boolean;
    /**
     * 当 `autoInit=true` 时，init 完成前是否禁用输入区
     * @default true
     */
    disableSenderBeforeInit?: boolean;
    /**
     * autoInit 前置条件
     * 仅在 `autoInit=true` 时有效，当提供该值时只在其为 truthy 时触发初始化。
     * 典型用法：`initWhen={!!tableId}` 确保上下文就绪后再初始化。
     */
    initWhen?: boolean;
    /**
     * init 状态变化回调
     * 仅在 `autoInit=true` 时有意义。
     * 第二个参数提供 `retryInit` 方法，可在 `status='failed'` 时调用以重新尝试初始化。
     */
    onInitStatusChange?: (status: InitStatus, actions: {
        retryInit: () => void;
    }) => void;
    /**
     * 是否启用历史消息加载
     * 启用后滚动到消息区顶部时自动调用 `adapter.queryHistory` 拉取更早消息。
     * 需要 adapter 同时实现 `queryHistory` 方法。
     * @default false
     */
    enableHistory?: boolean;
    /**
     * 历史消息每页拉取数量
     * @default 20
     */
    historyPageSize?: number;
    /**
     * 触发历史加载的顶部距离阈值（px）
     * 当 scrollTop <= 此值时自动触发加载
     * @default 24
     */
    historyThreshold?: number;
    /**
     * 受控消息列表
     * 传入后进入受控模式，组件不维护内部消息 state，
     * 所有消息变更通过 `onMessagesChange` 通知外部
     */
    messages?: ChatMessage[];
    /**
     * 消息列表变化回调
     * - 受控模式：必传，外部据此更新 state
     * - 非受控模式：可选，用于同步/监听消息变化
     */
    onMessagesChange?: (messages: ChatMessage[]) => void;
    /**
     * 快捷回复按钮点击回调
     * 在自动发送前触发，可用于埋点或自定义拦截。
     */
    onQuickReplyClick?: (info: {
        messageId: string;
        reply: ChatQuickReply;
        prompt: string;
    }) => void;
    /**
     * 自定义单条消息渲染
     * 传入后替代默认的 MessageItem 组件（包括 quick replies 区域）
     * @param message 消息数据
     * @param index 消息在列表中的索引
     */
    renderMessage?: (message: ChatMessage, index: number) => React.ReactNode;
    /**
     * 自定义消息操作区渲染（如快捷回复按钮区域）
     * 传入后替代默认的 quick replies 按钮列表，
     * 但保留默认消息气泡。
     * 当 `renderMessage` 也传入时，`renderMessageActions` 不生效。
     *
     * helpers 说明：
     * - `submitQuickReply(reply)` **推荐**：复用内置行为链路（触发 onQuickReplyClick、quick_reply_click 事件、标记 quickRepliesConsumed、自动 handleSubmit）
     * - `handleSubmit(prompt)` 仅发送消息，不触发上述 quick-reply 相关的事件和消费标记
     */
    renderMessageActions?: (message: ChatMessage, index: number, helpers: {
        handleSubmit: (prompt: string) => void;
        submitQuickReply: (reply: ChatQuickReply) => void;
    }) => React.ReactNode;
    /**
     * 空状态渲染
     * 消息列表为空时展示，不传则使用默认文案"开始对话吧"
     */
    renderEmpty?: () => React.ReactNode;
    /**
     * 顶部区域渲染
     * 可用于展示标题栏、返回按钮等
     */
    renderHeader?: () => React.ReactNode;
    /**
     * Sender 下方额外区域渲染
     * 可用于展示免责声明、快捷操作等
     */
    renderFooterExtra?: () => React.ReactNode;
}
