import { type EventDataApiBase, type Message, MessageScope, type MessageQuick, type CommandResult, type EventDataPrivateMsg, type EventDataGroupMsg, type EventDataChannelMsg } from '../types';
import type { Adapter } from './adapter';
import { formatFactory } from '../utils/factory';
import { CommandError } from '../utils/error';
import type { Api } from './api';
import type { Elements } from './elements';
import type { I18n } from '@kotori-bot/i18n';
declare class SessionOrigin<T extends EventDataApiBase = EventDataApiBase> implements EventDataApiBase {
    /**
     * Api instance of current session.
     *
     * @readonly
     */
    readonly api: Api;
    /**
     * Elements instance of current session.
     *
     * @readonly
     */
    readonly el: Elements;
    /**
     * I18n instance of current session.
     *
     * @readonly
     */
    readonly i18n: I18n;
    /**
     * Session unique id, generated base on `type`. `userId`, `groupId`, `guildId`, `channelId`.
     *
     * @readonly
     */
    readonly id: string;
    /**
     * Send message to current session.
     *
     * @param message - Message to send
     * @returns Message id and sent time
     */
    send(message: Message): Promise<import("../types").SendMessageResponse>;
    /**
     * Format message template with data.
     *
     * @param template - Message template
     * @param data - Data to format
     * @returns Formatted message
     */
    readonly format: ReturnType<typeof formatFactory>;
    /**
     * Send message to current session, it's packed base on `session.send()`, `session.i18n` and `session.format()`.
     *
     * @param message - Message to send
     * @returns Message id and sent time
     *
     * @async
     */
    quick(message: MessageQuick): Promise<void>;
    /**
     * Get message from current session.
     *
     * @param message - Message to get
     * @returns Message id and sent time
     */
    json(message: unknown): Promise<import("../types").SendMessageResponse>;
    /**
     * Prompt message to current session.
     *
     * @param message - Message to prompt
     * @returns Message from current session
     *
     * @async
     */
    prompt(message?: Message): Promise<Message>;
    /**
     * Confirm message to current session.
     *
     * @param options - Options to confirm
     * @returns Message from current session
     *
     * @async
     */
    confirm(options?: {
        message: Message;
        sure: Message;
    }): Promise<boolean>;
    /**
     * Create a command error.
     *
     * @param type - Error type
     * @param data - Error data
     * @returns Command error
     */
    error<K extends keyof CommandResult>(type: K, data?: CommandResult[K]): CommandError;
    readonly t: I18n['t'];
    /**
     * Session type
     *
     * @readonly
     */
    readonly type: EventDataApiBase['type'];
    /**
     * Session time, milliseconds timestamp.
     *
     * @readonly
     */
    readonly time: number;
    /**
     * Session related user id if exists.
     *
     * @readonly
     */
    readonly userId?: string;
    /**
     * Session related operator id if exists.
     *
     * @readonly
     */
    readonly operatorId?: string;
    /**
     * Session related message id if exists.
     *
     * @readonly
     */
    readonly messageId?: string;
    /**
     * Session related group id if exists.
     *
     * @readonly
     */
    readonly groupId?: string;
    /**
     * Session related channel id if exists.
     *
     * @readonly
     */
    readonly channelId?: string;
    /**
     * Session related guild id if exists.
     *
     * @readonly
     */
    readonly guildId?: string;
    /**
     * Session related meta data if exists, it is customized by the specific adapter.
     *
     * @readonly
     */
    readonly meta?: EventDataApiBase['meta'];
    /**
     * Create a session instance.
     *
     * @param data - Session data
     * @param adapter - Adapter instance
     *
     * @constructor
     */
    constructor(data: T, adapter: Adapter);
}
/**
 * Session instance.
 *
 * @class Session
 * @extends {SessionOrigin}
 * @template T
 */
export type Session<T extends EventDataApiBase = EventDataApiBase> = SessionOrigin<T> & T;
export type SessionMsg = Session<EventDataPrivateMsg | EventDataGroupMsg | EventDataChannelMsg>;
export type SessionMsgPrivate = Session<EventDataPrivateMsg>;
export type SessionMsgGroup = Session<EventDataGroupMsg>;
export type SessionMsgChannel = Session<EventDataChannelMsg>;
/**
 * Session event.
 *
 * @class
 * @template T - Session event data type
 */
export declare const Session: new <T extends EventDataApiBase<MessageScope> = EventDataApiBase<MessageScope>>(data: T, bot: Adapter) => Session<T>;
export {};
