import type { Message, MessageMapping } from '../types';
type MessageTypeList = {
    [K in keyof MessageMapping]: {
        type: K;
    } & MessageMapping[K];
};
/**
 * Single message class.
 *
 * @template T - Message type
 */
export declare class MessageSingle<T extends keyof MessageMapping> extends String {
    /**
     * Message data.
     *
     * @readonly
     */
    data: MessageTypeList[T];
    /**
     * Create a single message
     *
     * @param type - Message type
     * @param data - Message data
     */
    constructor(type: T, data: MessageMapping[T]);
    /**
     * Convert message to string.
     *
     * @param isStrict - Whether to strictly convert message, strict convert will ignore the elements else text
     * @returns Message string
     */
    toString(isStrict?: boolean): string;
    /**
     * Check whether the message is text.
     *
     * @returns Whether the message is text
     */
    isText(): boolean;
}
declare class MessageListOrigin<T extends keyof MessageMapping> extends Array<MessageSingle<T>> {
    /**
     * Create a message list.
     *
     * @param messages - Message list
     */
    constructor(...messages: Message<T>[]);
    /**
     * Convert message list to string.
     *
     * @param isStrict - Whether to strictly convert message, strict convert will ignore the elements else text
     * @returns Message string
     */
    toString(isStrict?: boolean): string;
    /**
     * Check whether the message list is pure.
     *
     * @param keys - Message type list
     *
     * @returns Whether the message list is pure
     */
    isPure<T extends keyof MessageMapping>(...keys: T[]): boolean;
    /**
     * Check whether the message list is text.
     *
     * @returns Whether the message list is text
     */
    isText(): boolean;
    /**
     * Pick message list.
     *
     * @param keys - Message type list
     * @returns Message list
     */
    pick<T extends keyof MessageMapping>(...keys: T[]): MessageList<T>;
    /**
     * Omit message list.
     *
     * @param keys - Message type list
     * @returns Message list
     */
    omit<T extends keyof MessageMapping>(...keys: T[]): MessageList<T>;
}
/**
 * Message list class.
 *
 * @template T - Message type
 * @class
 */
export type MessageList<T extends keyof MessageMapping> = (typeof String)['prototype'] & MessageListOrigin<T>;
export declare const MessageList: new <T extends keyof MessageMapping = keyof MessageMapping>(...args: ConstructorParameters<typeof MessageListOrigin>) => MessageList<T>;
/**
 * Create a message list.
 *
 * @param messages - Message list
 * @returns Message list
 */
export declare function Messages<T extends keyof MessageMapping = keyof MessageMapping>(...messages: Message<T>[]): MessageList<keyof MessageMapping>;
/**
 * Messages namespace
 *
 * @namespace
 */
export declare namespace Messages {
    /**
     * Create a text message.
     *
     * @param text - Text string
     * @returns Text message
     */
    function text(text: string): MessageSingle<"text">;
    /**
     * Create a mention message.
     *
     * @param userId - User id
     * @returns Mention message
     */
    function mention(userId: string): MessageSingle<"mention">;
    /**
     * Create a mention all message.
     *
     * @returns Mention all message
     */
    function mentionAll(): MessageSingle<"mentionAll">;
    /**
     * Create an image message.
     *
     * @param content - Image content
     * @returns Image message
     */
    function image(content: string): MessageSingle<"image">;
    /**
     * Create a voice message.
     *
     * @param content - Voice content
     * @returns Voice message
     */
    function voice(content: string): MessageSingle<"voice">;
    /**
     * Create an audio message.
     *
     * @param content - Audio content
     * @returns Audio message
     */
    function audio(content: string): MessageSingle<"audio">;
    /**
     * Create a video message.
     *
     * @param content - Video content
     * @returns Video message
     */
    function video(content: string): MessageSingle<"video">;
    /**
     * Create a file message.
     *
     * @param content - File content
     * @returns File message
     */
    function file(content: string): MessageSingle<"file">;
    /**
     * Create a location message.
     *
     * @param latitude - Latitude
     * @param longitude - Longitude
     * @param title - Title
     * @param content - Content
     * @returns Location message
     */
    function location(latitude: number, longitude: number, title: string, content: string): MessageSingle<"location">;
    /**
     * Create a reply message.
     *
     * @param messageId - Message id
     * @returns Reply message
     */
    function reply(messageId: string): MessageSingle<"reply">;
    /**
     * Stringify message.
     *
     * @param type - Message type
     * @param data - Message data
     * @param isStrict - Whether to strictly convert message, strict convert will ignore the elements else text
     * @returns Message string
     */
    function stringify<T extends keyof MessageMapping>(type: T, data: MessageMapping[T], isStrict?: boolean): string;
}
export default Messages;
