import API, { CountingResponse } from "./api.js";
import { IMethodParams } from "./../Session/Session.js";
import { UserObject } from "./users.js";
interface ForwardMessageFormat {
    owner_id?: number;
    peer_id: number;
    conversation_message_ids?: number[];
    message_ids?: number[];
    is_reply?: boolean;
}
interface ButtonBase {
    type: string;
    payload?: string;
}
interface ButtonText extends ButtonBase {
    type: "text";
    label: string;
}
interface ButtonOpenLink extends ButtonBase {
    type: "open_link";
    label: string;
    link: string;
}
interface ButtonLocation extends ButtonBase {
    type: "location";
}
interface ButtonVKPay extends ButtonBase {
    type: "vkpay";
    hash: string;
}
interface ButtonVKApp extends ButtonBase {
    type: "open_app";
    app_id: number;
    owner_id: number;
    label: string;
    hash: string;
}
interface ButtonCallback extends ButtonBase {
    type: "callback";
    label: string;
}
declare type ButtonAction = ButtonText | ButtonOpenLink | ButtonLocation | ButtonVKPay | ButtonVKApp | ButtonCallback;
interface Button {
    action: ButtonAction;
    color?: "primary" | "secondary" | "negative" | "positive";
}
interface Keyboard {
    one_time?: boolean;
    inline?: boolean;
    buttons: Button[][];
}
interface TemplateCarouselOpenLink {
    type: "open_link";
    link: string;
}
interface TemplateCarouselOpenPhoto {
    type: "open_photo";
}
declare type TemplateCarouselAction = TemplateCarouselOpenLink | TemplateCarouselOpenPhoto;
interface TemplateCarouselElement {
    title?: string;
    photo_id?: number;
    description?: string;
    buttons?: Button[];
    action?: TemplateCarouselAction;
}
interface TemplateCarousel {
    type: "carousel";
    elements: TemplateCarouselElement[];
}
declare type Template = TemplateCarousel;
interface ContentSourceFromMessage {
    type: 'message';
    owner_id: number;
    peer_id: number;
    conversation_message_id: number;
}
interface ContentSourceFromURL {
    type: "url";
    url: string;
}
declare type ContentSource = ContentSourceFromMessage | ContentSourceFromURL;
declare type Intent = "promo_newsletter" | "bot_ad_invite" | "bot_ad_promo" | "non_promo_newsletter" | "confirmed_notification" | "purchase_update" | "account_update" | "game_notification" | "customer_support" | "default";
interface SendAdditionalParams extends IMethodParams {
    random_id?: number;
    lat?: number;
    long?: number;
    reply_to?: number;
    forward_messages?: number | number[];
    forward?: ForwardMessageFormat;
    sticker_id?: number;
    group_id?: number;
    keyboard?: Keyboard;
    template?: Template;
    payload?: string;
    content_source?: ContentSource;
    dont_parse_links?: boolean;
    disable_mentions?: boolean;
    intent?: Intent;
    subscribe_id?: number;
}
interface SendMessageResponse {
    peer_id: number;
    message_id?: number;
    conversation_message_id?: number;
    error?: string;
}
interface DeleteMessageResponse {
    [key: string]: 0 | 1;
}
interface EditAdditionalParams extends IMethodParams {
    lat?: number;
    long?: number;
    keep_forward_messages?: boolean;
    keep_snippets?: boolean;
    group_id?: number;
    dont_parse_links?: boolean;
    keyboard?: Keyboard;
    template?: Template;
}
interface ConversationMember {
    member_id: number;
    invited_by: number;
    join_date: number;
    is_admin?: boolean;
    is_owner?: boolean;
    can_kick?: boolean;
}
interface ConversationMembersResponse extends CountingResponse<ConversationMember> {
    profiles: UserObject[];
    groups: GroupInfo[];
}
declare enum GroupClosed {
    Open = 0,
    Closed = 1,
    Private = 2
}
interface GroupInfo {
    id: number;
    name: string;
    screen_name: string;
    is_closed: GroupClosed;
    deactivated?: "deleted" | "banned";
    is_admin?: 0 | 1;
    admin_level?: 1 | 2 | 3;
    is_member?: 0 | 1;
    is_advertiser?: 0 | 1;
    invited_by?: number;
    type: "group" | "page" | "event";
    photo_50: string;
    photo_100: string;
    photo_200: string;
}
interface GetConversationMembersAdditionalParams extends IMethodParams {
    fields?: string[];
    group_id?: number;
    peer_id?: number;
}
export default class MessagesAPI extends API {
    private api_name;
    send(peer_id: number, message?: string, attachments?: string | string[], params?: SendAdditionalParams): Promise<number>;
    send(peer_id: string, message?: string, attachments?: string | string[], params?: SendAdditionalParams): Promise<number>;
    send(peers_id: number[], message?: string, attachments?: string | string[], params?: SendAdditionalParams): Promise<SendMessageResponse[]>;
    edit(peer_id: number, message_id: number, message?: string, attachments?: string | string[], params?: EditAdditionalParams): Promise<1>;
    delete(message_ids: number[], spam?: boolean, delete_for_all?: boolean, group_id?: number): Promise<DeleteMessageResponse>;
    delete(message_id: number, spam?: boolean, delete_for_all?: boolean, group_id?: number): Promise<DeleteMessageResponse>;
    getConversationMembers(peer_id: number, params?: GetConversationMembersAdditionalParams): Promise<ConversationMembersResponse>;
    removeChatUser(chat_id: number, member_id: number): Promise<1>;
    removeChatUserFromPeer(peer_id: number, member_id: number): Promise<1>;
    editChat(chat_id: number, title: string): Promise<1>;
    editChatFromPeer(peer_id: number, title: string): Promise<1>;
}
export {};
