import React from 'react';
import { XAgent } from '../use-x-agent';
export type SimpleType = string | number | boolean | object;
export type MessageStatus = 'local' | 'loading' | 'success' | 'error';
type RequestPlaceholderFn<Message extends SimpleType> = (message: Message, info: {
    messages: Message[];
}) => Message;
type RequestFallbackFn<Message extends SimpleType> = (message: Message, info: {
    error: Error;
    messages: Message[];
}) => Message | Promise<Message>;
export interface XChatConfig<AgentMessage extends SimpleType = string, BubbleMessage extends SimpleType = AgentMessage> {
    agent?: XAgent<AgentMessage>;
    defaultMessages?: DefaultMessageInfo<AgentMessage>[];
    /** Convert agent message to bubble usage message type */
    parser?: (message: AgentMessage) => BubbleMessage | BubbleMessage[];
    requestPlaceholder?: AgentMessage | RequestPlaceholderFn<AgentMessage>;
    requestFallback?: AgentMessage | RequestFallbackFn<AgentMessage>;
}
export interface MessageInfo<Message extends SimpleType> {
    id: number | string;
    message: Message;
    status: MessageStatus;
}
export type DefaultMessageInfo<Message extends SimpleType> = Pick<MessageInfo<Message>, 'message'> & Partial<Omit<MessageInfo<Message>, 'message'>>;
export type RequestResultObject<Message> = {
    message: Message | Message[];
    status: MessageStatus;
};
export type RequestResult<Message extends SimpleType> = Message | Message[] | RequestResultObject<Message> | RequestResultObject<Message>[];
export type StandardRequestResult<Message extends SimpleType> = Omit<RequestResultObject<Message>, 'message' | 'status'> & {
    message: Message;
    status?: MessageStatus;
};
export default function useXChat<AgentMessage extends SimpleType = string, ParsedMessage extends SimpleType = AgentMessage>(config: XChatConfig<AgentMessage, ParsedMessage>): {
    readonly onRequest: (message: AgentMessage) => void;
    readonly messages: MessageInfo<AgentMessage>[];
    readonly parsedMessages: MessageInfo<ParsedMessage>[];
    readonly setMessages: (action: React.SetStateAction<MessageInfo<AgentMessage>[]>) => void;
};
export {};
