import { EntityAPI } from '@ayanaware/bento';
import { ExtendedUser, FileContent, Guild, Member, Message, MessageContent, TextableChannel, User } from 'eris';
import { BentocordInterface } from '../BentocordInterface';
import { Discord } from '../discord/Discord';
import { DiscordPermission } from '../discord/constants/DiscordPermission';
import { AgnosticMessageContent } from '../interfaces/AgnosticMessageContent';
import { PossiblyTranslatable, Translatable } from '../interfaces/Translatable';
import { PaginationOptions } from '../prompt/PaginationPrompt';
import { PromptOptions, PromptValidator } from '../prompt/Prompt';
import { AnyPaginator } from '../prompt/helpers/AnyPaginator';
import { CodeblockPaginatorItems } from '../prompt/helpers/CodeblockPaginator';
export declare class BaseContext<C extends MessageContent = MessageContent> {
    readonly api: EntityAPI;
    channel: TextableChannel;
    get channelId(): string;
    user: User;
    get userId(): string;
    /** Member object if available */
    member?: Member;
    /** @deprecated Use .user instead */
    get author(): User;
    /** @deprecated Use .userId instead */
    get authorId(): string;
    guild?: Guild;
    get guildId(): string;
    /** Bot's user object */
    self: ExtendedUser;
    get selfId(): string;
    /** Bot's member object if available */
    selfMember?: Member;
    readonly interface: BentocordInterface;
    readonly discord: Discord;
    responseId?: string;
    protected responseMessage?: Message;
    /** .prepare() must be called before this object is ready to be used */
    constructor(api: EntityAPI, channel: TextableChannel, user: User);
    /**
     * Finishes preparing the context, handling async operations.
     */
    prepare(): Promise<void>;
    /**
     * Check if command author is a owner
     */
    isBotOwner(): Promise<boolean>;
    /**
     * Format a number based on who/where ran
     * @param num Number
     * @returns
     */
    formatNumber(num: number): Promise<string>;
    /**
     * Format a date based on who/where ran
     * @param date Date
     * @returns Formatted date
     */
    formatDate(date: Date): Promise<string>;
    /**
     * Format a translation based on who/where ran
     * @param key Translation Key
     * @param repl Translation Replacements
     * @param backup Translation Backup
     * @returns Formatted translation or null
     */
    formatTranslation(key: string, repl?: Record<string, unknown>, backup?: string): Promise<string>;
    formatTranslation(translatable: Translatable): Promise<string>;
    /**
     * Check if the author has a Discord permission
     * @param permission DiscordPermission
     */
    hasPermission(permission: DiscordPermission): boolean;
    /**
     * Check if the application has a Discord permission
     * @param permission DiscordPermission
     */
    selfHasPermission(permission: DiscordPermission): boolean;
    /**
     * Prompt command invoker for additional input
     * @param content Message to display
     * @param validator Validate their input
     * @param options PromptOptions
     * @returns Validated input
     */
    prompt<T = string>(content: PossiblyTranslatable | AgnosticMessageContent, validator?: PromptValidator<T>, options?: PromptOptions): Promise<T>;
    /**
     * Prompt command author for extra confirmation
     * @param content details about what they are confirming
     * @returns boolean
     */
    confirm(content?: PossiblyTranslatable | AgnosticMessageContent, items?: AnyPaginator<void> | CodeblockPaginatorItems<void>): Promise<boolean>;
    /**
     * Show a pagination UI
     * @param items Array of items
     * @param content details about what they are seeing
     * @param options PaginationOptions
     * @returns
     */
    pagination(items: AnyPaginator<void> | CodeblockPaginatorItems<void>, content?: PossiblyTranslatable | AgnosticMessageContent, options?: PaginationOptions): Promise<void>;
    /**
     * Prompt command author to select a choice
     * @param choices Array of PromptChoice
     * @param content details about what they are choosing
     * @param options PagiantionOptions
     * @returns Selected PromptChoice value
     */
    choice<T = string>(choices: AnyPaginator<T> | CodeblockPaginatorItems<T>, content?: PossiblyTranslatable | AgnosticMessageContent, options?: PaginationOptions): Promise<T>;
    getResponse(): Promise<Message>;
    createResponse(response: C, files?: Array<FileContent>): Promise<void>;
    editResponse(response: C, files?: Array<FileContent>): Promise<void>;
    deleteResponse(): Promise<void>;
    /**
     * Send translated response, getTranstion & createResponse
     * @param key Translation Key
     * @param repl Replacements
     * @param backup Backup
     * @returns Message/Interaction
     */
    createTranslatedResponse(key: string, repl?: Record<string, unknown>, backup?: string, content?: AgnosticMessageContent): Promise<unknown>;
    /**
     * Edit translation response
     * @param key Translation Key
     * @param repl Replacements
     * @param backup Backup
     * @returns Message/Interaction
     */
    editTranslatedResponse(key: string, repl?: Record<string, unknown>, backup?: string, content?: AgnosticMessageContent): Promise<unknown>;
    createMessage(content: C, files?: Array<FileContent>): Promise<Message>;
    editMessage(messageId: string, content: C, files?: Array<FileContent>): Promise<Message>;
    deleteMessage(messageId: string): Promise<void>;
    createTranslatedMessage(key: string, repl?: Record<string, unknown>, backup?: string, content?: AgnosticMessageContent): Promise<Message>;
    editTranslatedMessage(messageId: string, key: string, repl?: Record<string, unknown>, backup?: string, content?: AgnosticMessageContent): Promise<Message>;
}
