import { CallVariables } from './call';
import { Client, FileUploadProgress } from './client';
import { Reporting, Task, TaskData } from './task';
/**
 * Перелік причин відмови.
 */
export declare enum DeclineCause {
    Timeout = "TIMEOUT",
    Busy = "BUSY",
    Cancel = "CANCEL",
    Transfer = "TRANSFER"
}
/**
 * Перелік дій чату.
 */
export declare enum ChatActions {
    Message = "message",
    UserInvite = "user_invite",
    Invite = "invite_conversation",
    Joined = "join_conversation",
    Close = "close_conversation",
    Leave = "leave_conversation",
    Decline = "decline_invite",
    Update = "update_channel",
    Destroy = "destroy",
    MessageDeleted = "message_deleted"
}
/**
 * Перелік станів розмови.
 */
export declare enum ConversationState {
    Init = "init",
    Invite = "invite",
    Active = "active",
    Pending = "pending",
    Closed = "closed"
}
/**
 * Подія чату.
 */
export interface ChatEvent {
    /**
     * Дія, що викликала подію.
     * @type {string}
     */
    action: string;
    /**
     * Дані події.
     * @type {object}
     */
    data?: object;
}
/**
 * Базовий інтерфейс події чату.
 */
export interface BaseChatEvent {
    /**
     * Ідентифікатор розмови.
     * @type {string}
     */
    conversation_id: string;
    /**
     * Час події (Unix timestamp).
     * @type {number}
     */
    timestamp: number;
}
/**
 * Подія запрошення до чату.
 */
export interface InviteEvent extends BaseChatEvent {
    /**
     * Ідентифікатор запрошення.
     * @type {string}
     */
    invite_id: string;
    /**
     * Назва розмови.
     * @type {string}
     */
    title: string;
    /**
     * Члени чату.
     * @type {ChatChannel[]}
     */
    members: ChatChannel[];
    /**
     * Повідомлення в чаті.
     * @type {Message[]}
     */
    messages: Message[];
    /**
     * Інформація про розмову.
     * @type {ConversationInfo}
     */
    conversation: ConversationInfo;
    /**
     * Змінні виклику.
     * @type {CallVariables}
     */
    variables?: CallVariables;
}
/**
 * Подія приєднання до чату.
 */
export interface JoinedEvent extends BaseChatEvent {
    /**
     * Член чату, що приєднався.
     * @type {ChatChannel}
     */
    member: ChatChannel;
}
/**
 * Подія повідомлення в чаті.
 */
export interface MessageEvent extends BaseChatEvent, Message {
}
/**
 * Подія виходу з чату.
 */
export interface LeavedEvent extends BaseChatEvent {
    /**
     * Ідентифікатор чату, з якого вийшли.
     * @type {string}
     */
    leaved_channel_id: string;
    /**
     * Причина виходу.
     * @type {DeclineCause | null}
     */
    cause?: DeclineCause | null;
}
/**
 * Подія закриття чату.
 */
export interface CloseEvent extends BaseChatEvent {
    /**
     * Ідентифікатор каналу, з якого закрито розмову.
     * @type {string}
     */
    from_channel_id: string;
    /**
     * Причина закриття.
     * @type {string}
     */
    cause: string;
}
/**
 * Подія відмови від запрошення.
 */
export interface DeclineInviteEvent extends BaseChatEvent {
    /**
     * Ідентифікатор користувача, який відмовився.
     * @type {number}
     */
    user_id: number;
    /**
     * Ідентифікатор запрошення.
     * @type {string}
     */
    invite_id: string;
    /**
     * Причина відмови.
     * @type {DeclineCause | null}
     */
    cause?: DeclineCause | null;
}
/**
 * Подія оновлення каналу.
 */
export interface UpdateChannelEvent extends BaseChatEvent {
    /**
     * Ідентифікатор каналу.
     * @type {string}
     */
    channel_id: string;
    /**
     * Час оновлення.
     * @type {number}
     */
    updated_at: number;
}
/**
 * Інтерфейс для повідомлення в чаті.
 */
export interface Message {
    /**
     * Ідентифікатор повідомлення.
     * @type {number}
     */
    id: number;
    /**
     * Ідентифікатор каналу.
     * @type {string}
     */
    channel_id: string;
    /**
     * Тип повідомлення.
     * @type {string}
     */
    type: string;
    /**
     * Текст повідомлення.
     * @type {string}
     */
    text: string;
    /**
     * Файл, прикріплений до повідомлення.
     * @type {MessageFile}
     */
    file?: MessageFile;
    /**
     * Контактна інформація.
     * @type {object}
     */
    contact?: object;
    /**
     * Час створення.
     * @type {number}
     */
    created_at: number;
    /**
     * Час оновлення.
     * @type {number | null}
     */
    updated_at?: number | null;
    conversation?: string;
}
/**
 * Інтерфейс для видаленого повідомлення.
 */
export interface MessageDeleted {
    /**
     * Ідентифікатор повідомлення.
     * @type {number}
     */
    id: number;
    /**
     * Ідентифікатор каналу.
     * @type {string}
     */
    channel_id: string;
    /**
     * Ідентифікатор розмови.
     * @type {string}
     */
    conversation_id: string;
    /**
     * Тип повідомлення.
     * @type {string}
     */
    type: string;
    /**
     * Текст повідомлення.
     * @type {string}
     */
    text: string;
    /**
     * Час повідомлення.
     * @type {number}
     */
    timestamp: number;
    /**
     * Час створення.
     * @type {number | undefined}
     */
    created_at?: number;
}
/**
 * Інтерфейс для інформації про канал чату.
 */
export interface ChatChannel {
    /**
     * Ідентифікатор каналу.
     * @type {string | undefined}
     */
    id?: string;
    /**
     * Назва каналу.
     * @type {string | undefined}
     */
    name?: string;
    /**
     * Тип каналу.
     * @type {string | undefined}
     */
    type?: string;
    /**
     * Месенджер каналу.
     * @type {string | undefined}
     */
    messenger?: string;
    /**
     * Чи є це самостійний користувач.
     * @type {boolean | undefined}
     */
    self?: boolean;
}
/**
 * Інтерфейс для файлу повідомлення.
 */
export interface MessageFile {
    /**
     * Ідентифікатор файлу.
     * @type {number}
     */
    id: number;
    /**
     * Назва файлу.
     * @type {string}
     */
    name: string;
    /**
     * MIME-тип файлу.
     * @type {string}
     */
    mime: string;
    /**
     * Розмір файлу.
     * @type {number}
     */
    size: number;
    /**
     * URL для завантаження файлу.
     * @type {string}
     */
    url: string;
    /**
     * URL для потокового доступу до файлу.
     * @type {string}
     */
    streamUrl: string;
}
/**
 * Інтерфейс для повідомлення з інформацією про канал.
 */
export interface MessageWithChannel {
    /**
     * Ідентифікатор повідомлення.
     * @type {number}
     */
    id: number;
    /**
     * Ідентифікатор каналу.
     * @type {string}
     */
    channelId: string;
    /**
     * Тип повідомлення.
     * @type {string}
     */
    type: string;
    /**
     * Файл, прикріплений до повідомлення.
     * @type {MessageFile}
     */
    file?: MessageFile;
    /**
     * Текст повідомлення.
     * @type {string | undefined}
     */
    text?: string;
    /**
     * Контактна інформація.
     * @type {object | null}
     */
    contact?: object | null;
    /**
     * Час створення.
     * @type {number}
     */
    createdAt: number;
    /**
     * Час оновлення.
     * @type {number}
     */
    updatedAt: number;
    /**
     * Член чату, який відправив повідомлення.
     * @type {ChatChannel | null}
     */
    member: ChatChannel | null;
}
/**
 * Інтерфейс для інформації про розмову.
 */
export interface ConversationInfo {
    /**
     * Ідентифікатор розмови.
     * @type {string}
     */
    id: string;
    /**
     * Назва розмови.
     * @type {string}
     */
    title: string;
    /**
     * Час створення.
     * @type {number}
     */
    created_at: number;
    /**
     * Час оновлення.
     * @type {number | null}
     */
    updated_at: number | null;
}
/**
 * Інтерфейс для елемента розмови.
 */
export interface ConversationItem {
    /**
     * Ідентифікатор розмови.
     * @type {string}
     */
    id: string;
    /**
     * Ідентифікатор запрошення.
     * @type {string | undefined}
     */
    invite_id?: string;
    /**
     * Ідентифікатор каналу.
     * @type {string | undefined}
     */
    channel_id?: string;
    /**
     * Назва розмови.
     * @type {string}
     */
    title: string;
    /**
     * Час створення.
     * @type {number}
     */
    created_at: number;
    /**
     * Час закриття.
     * @type {number}
     */
    closed_at: number;
    /**
     * Час оновлення.
     * @type {number}
     */
    updated_at: number;
    /**
     * Час приєднання.
     * @type {number}
     */
    joined_at: number;
    /**
     * Час виходу.
     * @type {number | undefined}
     */
    leaving_at?: number;
    /**
     * Змінні виклику.
     * @type {CallVariables | undefined}
     */
    variables?: CallVariables;
    /**
     * Члени розмови.
     * @type {ChatChannel[]}
     */
    members: ChatChannel[];
    /**
     * Повідомлення в розмові.
     * @type {Message[]}
     */
    messages: Message[];
    /**
     * Дані задачі.
     * @type {TaskData | undefined}
     */
    task?: TaskData;
    member?: ChatChannel;
}
/**
 * Інтерфейс для контакту.
 */
interface Contact {
    /**
     * Ідентифікатор контакту.
     * @type {number | null}
     */
    id: number | null;
    /**
     * Приховати контакт.
     * @type {boolean}
     */
    hide: boolean;
}
/**
 * Клас Conversation: Описує чат, включаючи його стан, учасників, повідомлення та інші атрибути.
 *
 * Конструктор Conversation:
 *  client: Клієнт для виконання запитів, використовуваних у розмові.
 *  conversationId: Ідентифікатор розмови.
 *  title: Назва розмови.
 *  members: Список учасників розмови.
 *  messages: Список повідомлень у розмові.
 *  variables: Опційні змінні виклику, що можуть бути використані в розмові.
 * Конструктор ініціалізує всі властивості класу, задаючи значення за замовчуванням або використовує
 * передані параметри для налаштування об'єкта розмови.
 */
export declare class Conversation {
    private readonly client;
    private readonly conversationId;
    private readonly title;
    data: any;
    state: ConversationState;
    channelId: string | null;
    inviteId: string | null;
    member: ChatChannel;
    members: ChatChannel[];
    _cause: DeclineCause | null;
    _messages: Message[];
    autoAnswered: boolean;
    _autoAnswerParam: boolean | string | number;
    _autoAnswerTimerId: any | null;
    createdAt: number;
    updatedAt: number;
    answeredAt: number;
    invitedAt: number;
    closedAt: number;
    _hasReporting: boolean;
    lastAction: ChatActions | null;
    variables?: CallVariables;
    task: Task | null;
    queue: {
        [index: string]: any;
    } | null;
    contact: Contact | null;
    meetingId: string | null;
    /**
     * Конструктор для розмови.
     * @param {Client} client - Клієнт для виконання запитів.
     * @param {string} conversationId - Ідентифікатор розмови.
     * @param {string} title - Назва розмови.
     * @param {ChatChannel[]} members - Члени розмови.
     * @param {Message[]} messages - Повідомлення в розмові.
     * @param {CallVariables} [variables] - Змінні виклику.
     */
    constructor(client: Client, conversationId: string, title: string, members: ChatChannel[], messages: Message[], variables?: CallVariables);
    /**
     * Встановлює інформацію про запрошення.
     * @param {string} inviteId - Ідентифікатор запрошення.
     * @param {number} timestamp - Час запрошення.
     */
    setInvite(inviteId: string, timestamp: number): void;
    /**
     * Перевіряє, чи є ручний розподіл в черзі.
     * @type {boolean}
     */
    get manualDistribution(): boolean | null;
    /**
     * Отримує ідентифікатор контакту.
     * @type {number | null}
     */
    get contactId(): number | null;
    /**
     * Перевіряє, чи слід приховувати контакт.
     * @type {boolean}
     */
    get hideContact(): boolean | null;
    /**
     * Встановлює ідентифікатор контакту.
     * @param {number} id - Ідентифікатор контакту.
     */
    setContactId(id: number): void;
    /**
     * Перевіряє, чи потрібно автоматично відповісти.
     * @type {boolean}
     */
    get autoAnswer(): boolean;
    /**
     * Отримує затримку для автоматичної відповіді.
     * @type {number}
     */
    get autoAnswerDelay(): number;
    /**
     * Встановлює розмову як відповідану.
     * @param {string} channelId - Ідентифікатор каналу.
     * @param {number} timestamp - Час відповіді.
     * @param {ChatChannel} member - Член чату.
     */
    setAnswered(channelId: string, timestamp: number, member: ChatChannel): void;
    /**
     * Встановлює розмову як закриту.
     * @param {number} timestamp - Час закриття.
     */
    setClosed(timestamp: number): void;
    /**
     * Встановлює причину відмови від запрошення.
     * @param {DeclineInviteEvent} e - Подія відмови.
     */
    setDecline(e: DeclineInviteEvent): void;
    /**
     * Встановлює причину виходу з чату.
     * @param {LeavedEvent} e - Подія виходу.
     */
    setLeave(e: LeavedEvent): void;
    /**
     * Оновлює видалене повідомлення.
     * @param {MessageDeleted} d - Видалене повідомлення.
     */
    setDeletedMessage(d: MessageDeleted): void;
    /**
     * Отримує ідентифікатор розмови.
     * @type {string}
     */
    get id(): string;
    /**
     * Отримує причину відмови або виходу.
     * @type {DeclineCause | null}
     */
    get cause(): DeclineCause | null;
    /**
     * Отримує всі повідомлення з каналу.
     * @type {MessageWithChannel[]}
     */
    get messages(): MessageWithChannel[];
    get getConversationId(): string;
    /**
     * Отримує всі повідомлення з каналу.
     * @returns {MessageWithChannel[]}
     */
    getMessages(): MessageWithChannel[];
    /**
     * Обробляє наступний етап (потрібно реалізувати).
     * @returns {Promise<void>}
     */
    next(): Promise<void>;
    /**
     * Обробляє пагінацію для повідомлень.
     * @param {number} page - Номер сторінки.
     * @param {number} perPage - Кількість повідомлень на сторінку.
     * @returns {Promise<void>}
     */
    pagination(page: number, perPage: number): Promise<void>;
    /**
     * Додає нове повідомлення до розмови.
     * @param {MessageEvent} e - Подія нового повідомлення.
     */
    newMessage(e: MessageEvent): void;
    /**
     * Перевіряє, чи дозволена відмова.
     * @type {boolean}
     */
    get allowDecline(): boolean;
    /**
     * Перевіряє, чи дозволено приєднання.
     * @type {boolean}
     */
    get allowJoin(): boolean;
    /**
     * Перевіряє, чи дозволено вихід.
     * @type {boolean}
     */
    get allowLeave(): boolean;
    /**
     * Перевіряє, чи дозволена подача звітності.
     * @type {boolean}
     */
    get allowReporting(): boolean;
    /**
     * Перевіряє, чи є звітність.
     * @type {boolean}
     */
    get hasReporting(): boolean;
    /**
     * Отримує ідентифікатори всіх учасників.
     * @type {string[]}
     */
    get membersId(): string[];
    /**
     * @deprecated
     * Отримує завдання, яке зараз виконується.
     * @type {Task | null}
     */
    get attempt(): Task | null;
    /**
     * Перевіряє, чи була розмова передана.
     * @type {boolean}
     */
    get isTransferred(): boolean;
    /**
     * Відмовляється від розмови.
     * @param {DeclineCause} [cause] - Причина відмови.
     * @returns {Promise<void>}
     */
    decline(cause?: DeclineCause): Promise<object>;
    /**
     * Затримує приєднання до розмови, якщо потрібно.
     * @returns {Promise<void>}
     */
    joinDelay(): Promise<void>;
    /**
     * Приєднується до розмови.
     * @returns {Promise<void>}
     */
    join(): Promise<object>;
    /**
     * Закриває розмову.
     * @param {string} cause - Причина закриття.
     * @returns {Promise<void>}
     */
    close(cause: string): Promise<object>;
    /**
     * Виходить з розмови.
     * @param {string} cause - Причина виходу.
     * @returns {Promise<void>}
     */
    leave(cause: string): Promise<void | object>;
    /**
     * Відправляє текстове повідомлення.
     * @param {string} text - Текст повідомлення.
     * @returns {Promise<void>}
     */
    sendText(text: string): Promise<object | undefined>;
    /**
     * Відправляє файл.
     * @param {File} file - Файл для відправки.
     * @param {FileUploadProgress} [cb] - Колбек для відстеження прогресу завантаження.
     * @returns {Promise<void>}
     */
    sendFile(file: File, cb?: FileUploadProgress): Promise<object>;
    /**
     * Відправляє дані (текст або файл).
     * @param {string | File} data - Дані для відправки.
     * @param {FileUploadProgress} [cb] - Колбек для відстеження прогресу завантаження.
     * @returns {Promise<void>}
     */
    send(data: string | File, cb?: FileUploadProgress): Promise<object | undefined>;
    /**
     * Оновлює інформацію про членів розмови.
     * @param {ChatChannel[]} members - Нові члени розмови.
     */
    setMembers(members: ChatChannel[]): void;
    /**
     * Перевіряє, чи належить повідомлення розмові.
     * @param {Message} m - Повідомлення.
     * @returns {boolean}
     */
    isMessageInConversation(m: Message): boolean;
    /**
     * Надсилає звіт для поточної розмови.
     *
     * Цей метод викликає метод reporting об'єкта Task, щоб надіслати звіт про розмову.
     * Якщо розмова не знаходиться в черзі, буде згенерована помилка.
     *
     * @param {Reporting} reporting - Об'єкт Reporting, який містить дані звіту.
     * @throws {Error} - Якщо розмова не знаходиться в черзі.
     * @returns {Promise<any>} - Результат виконання методу reporting об'єкта Task.
     */
    reporting(reporting: Reporting): Promise<object>;
    /**
     * Оновлює час для поточної розмови в черзі.
     *
     * Цей метод викликає метод renew об'єкта Task, щоб оновити час розмови.
     * Якщо розмова не знаходиться в черзі, буде згенерована помилка.
     *
     * @param {number} [sec] - Кількість секунд для продовження розмови. Якщо не зазначено, використовується значення за замовчуванням.
     * @throws {Error} - Якщо розмова не знаходиться в черзі.
     * @returns {Promise<any>} - Результат виконання методу renew об'єкта Task.
     */
    renew(sec?: number): Promise<object>;
    /**
     * Переносить розмову до плану.
     *
     * Цей метод відправляє запит на сервер для перенесення розмови до зазначеного плану.
     *
     * @param {number} planId - Ідентифікатор плану, до якого потрібно перенести розмову.
     * @param {CallVariables} variables - Змінні.
     * @returns {Promise<any>} - Результат запиту на сервер для перенесення розмови.
     */
    transferToPlan(planId: number, variables?: CallVariables): Promise<object>;
    /**
     * Переносить розмову до іншого користувача.
     *
     * Цей метод відправляє запит на сервер для перенесення розмови до вказаного користувача.
     *
     * @param {number} userId - Ідентифікатор користувача, до якого потрібно перенести розмову.
     * @param {CallVariables} variables - Змінні.
     * @returns {Promise<any>} - Результат запиту на сервер для перенесення розмови.
     */
    transferToUser(userId: number, variables?: CallVariables): Promise<object>;
    /**
     * Встановлює контакт для розмови.
     *
     * Цей метод відправляє запит на сервер для призначення контактного ідентифікатора до розмови.
     *
     * @param {number} contactId - Ідентифікатор контакту, який потрібно призначити для розмови.
     * @returns {Promise<any>} - Результат запиту на сервер для встановлення контакту.
     */
    setContact(contactId: number): Promise<object>;
    /**
     * Надсилає частину текстового повідомлення у розмову.
     *
     * Цей метод надсилає частину текстового повідомлення на сервер у рамках розмови.
     *
     * @param {string} text - Текст повідомлення, яке потрібно надіслати.
     * @returns {Promise<any>} - Результат запиту на сервер для надсилання частини текстового повідомлення.
     */
    private sendMessageTextChunk;
    /**
     * Визначає учасника, який надіслав повідомлення.
     *
     * Цей метод перевіряє, чи є відправник повідомлення поточним учасником розмови або одним з членів розмови.
     *
     * @param {Message} msg - Повідомлення, для якого потрібно визначити відправника.
     * @returns {ChatChannel | null} - Об'єкт `ChatChannel`, що представляє учасника, який надіслав повідомлення, або `null`, якщо учасник не знайдено.
     */
    private messageMember;
}
export {};
//# sourceMappingURL=conversation.d.ts.map