import { EventEmitter } from 'ee-ts';
import { SipClient } from '../sip';
import { Agent, AgentStatusEvent } from './agent';
import { AnswerRequest, Call, CallActions, CallItem, CallVariables, EavesdropRequest, OutboundCallRequest, RtpMetrics } from './call';
import { Conversation, ConversationItem } from './conversation';
import { MessageNotification } from './notification';
import { QueueJoinMemberEvent } from './queue';
import { Reporting, Task, TaskData } from './task';
import { UserStatus } from './user';
import { ScreenResolver } from '../screen';
import { SpyScreen } from './screen';
/**
 * Налаштування клієнта.
 *
 * @interface Config
 * @property {string} endpoint - URL-адреса кінцевої точки для підключення клієнта.
 * @property {string} [storageEndpoint] - (Необов'язковий) URL-адреса кінцевої точки для зберігання даних.
 * @property {string} [token] - (Необов'язковий) Токен для аутентифікації клієнта.
 * @property {'debug' | 'info' | 'warn' | 'error'} [logLvl] - (Необов'язковий) Рівень логування для клієнта.
 * @property {boolean} [registerWebDevice] - (Необов'язковий) Вказує, чи слід реєструвати веб-пристрій.
 * @property {number} [phone] - (Необов'язковий) Номер телефону для реєстрації.
 * @property {boolean} [debug] - (Необов'язковий) Вказує, чи слід увімкнути режим налагодження.
 * @property {number} [autoAnswerDelayTime] - (Необов'язковий) Час затримки перед автоматичною відповіддю на дзвінок.
 */
export interface Config {
    endpoint: string;
    storageEndpoint?: string;
    token?: string;
    logLvl?: 'debug' | 'info' | 'warn' | 'error';
    registerWebDevice?: boolean;
    phone?: number;
    debug?: boolean;
    autoAnswerDelayTime?: number;
    screenResolver?: ScreenResolver | null;
    applicationName?: string;
}
/**
 * Запит на дзвінок користувачу.
 *
 * @interface UserCallRequest
 * @property {string | null} [nodeId] - (Необов'язковий) Ідентифікатор вузла, з якого здійснюється дзвінок. Якщо не вказано, значення буде null.
 * @property {string | null} [parentCallId] - (Необов'язковий) Ідентифікатор батьківського дзвінка, якщо такий існує.
 * @property {string | null} [sendToCallId] - (Необов'язковий) Ідентифікатор дзвінка, на який потрібно відправити виклик, якщо такий існує.
 * @property {string} toUserId - Ідентифікатор користувача, якому призначений дзвінок.
 * @property {boolean} [useVideo] - (Необов'язковий) Вказує, чи буде використовуватись відео під час дзвінка.
 * @property {boolean} [useScreen] - (Необов'язковий) Вказує, чи буде використовуватись спільний доступ до екрану під час дзвінка.
 * @property {boolean} [useAudio] - (Необов'язковий) Вказує, чи буде використовуватись аудіо під час дзвінка.
 * @property {CallVariables} [variables] - (Необов'язковий) Додаткові змінні, які будуть використані під час дзвінка.
 */
export interface UserCallRequest {
    nodeId?: string | null;
    parentCallId?: string | null;
    sendToCallId?: string | null;
    toUserId: string;
    useVideo?: boolean;
    useScreen?: boolean;
    useAudio?: boolean;
    variables?: CallVariables;
}
/**
 * Подія SDP (Session Description Protocol).
 */
export interface SdpEvent {
    sip_id: string;
    sdp: {
        sdp: string;
        type: string;
    };
}
export declare const WEBSOCKET_EVENT_CALL_MEDIA_METRIC = "call_media_metric";
/**
 * Статус відповіді.
 */
export declare enum Response {
    STATUS_FAIL = "FAIL",
    STATUS_OK = "OK"
}
/**
 * Інформація про сесію.
 *
 * Цей інтерфейс описує структуру даних, яка містить інформацію про сесію користувача.
 */
export interface Session {
    /**
     * Унікальний ідентифікатор сесії.
     */
    id: string;
    /**
     * Час закінчення дії сесії в секундах (UNIX timestamp).
     */
    expire: number;
    /**
     * Ідентифікатор користувача, до якого належить сесія.
     */
    user_id: number;
    /**
     * Список ідентифікаторів ролей, які має користувач у межах цієї сесії.
     */
    role_ids: number[];
    token: string;
}
/**
 * Інформація про з'єднання.
 *
 * Цей інтерфейс описує структуру даних, яка містить інформацію про поточне з'єднання з сервером.
 */
export interface ConnectionInfo {
    /**
     * Ідентифікатор сокет-з'єднання.
     */
    sock_id: string;
    /**
     * Коміт ідентифікатора збірки сервера.
     */
    server_build_commit: string;
    /**
     * Ідентифікатор вузла сервера, з яким встановлено з'єднання.
     */
    server_node_id: string;
    /**
     * Версія сервера, з яким встановлено з'єднання.
     */
    server_version: string;
    /**
     * Поточний час сервера в секундах (UNIX timestamp).
     */
    server_time: number;
    /**
     * Інтервал пінг-запитів у мілісекундах (необов'язкове).
     */
    ping_interval?: number;
    /**
     * Інформація про сесію користувача, пов'язану з цим з'єднанням.
     */
    session: Session;
    /**
     * Вказує на те, чи підтримує сервер Back-to-Back User Agent (необов'язкове).
     */
    b2bua?: boolean;
    /**
     * Вказує, чи дозволено використовувати чат для цього з'єднання (необов'язкове).
     */
    use_chat?: boolean;
    /**
     * Вказує, чи дозволено використовувати центр контактів (call center) для цього з'єднання (необов'язкове).
     */
    use_cc?: boolean;
    rtc_configuration?: RTCConfiguration;
}
/**
 * Відповідь списку дзвінків.
 */
export interface CallListResponse {
    items?: CallItem[];
    next?: boolean;
}
/**
 * Відповідь списку завдань.
 */
export interface TaskListResponse {
    items: TaskData[];
}
/**
 * Відповідь списку розмов.
 */
export interface ConversationListResponse {
    items?: ConversationItem[];
    next?: boolean;
}
/**
 * Інформація про файл у сховищі.
 *
 * Цей інтерфейс описує структуру даних, яка містить інформацію про файл, збережений у сховищі.
 */
export interface StorageShareFile {
    /**
     * Унікальний ідентифікатор файлу.
     */
    id: number;
    /**
     * Розмір файлу в байтах.
     */
    size: number;
    /**
     * MIME-тип файлу, який вказує на його формат.
     */
    mime: string;
    /**
     * Назва файлу.
     */
    name: string;
    /**
     * Посилання для доступу до файлу, якщо файл спільний.
     */
    shared: string;
}
/**
 * Функція для відстеження прогресу завантаження файлу.
 */
export type FileUploadProgress = (progress: any) => void;
/**
 * Обробник подій дзвінка.
 */
export type CallEventHandler = (action: CallActions, call: Call) => void;
/**
 * Обробник подій чату.
 */
export type ChatEventHandler = (action: string, conversation: Conversation) => void;
/**
 * Обробник подій статусу користувачів.
 */
export type UsersStatusEventHandler = (state: UserStatus) => void;
/**
 * Обробник подій статусу агента.
 */
export type AgentStatusEventHandler = (state: AgentStatusEvent, agent: Agent) => void;
/**
 * Обробник подій завдання.
 */
export type TaskEventHandler = (action: string, task: Task | undefined) => void;
/**
 * Обробник подій роботи.
 */
export type JobEventHandler = (action: string, task: Task) => void;
/**
 * Обробник подій приєднання абонента до черги.
 */
export type QueueJoinMemberHandler = (member: QueueJoinMemberEvent) => void;
/**
 * Події клієнта.
 *
 * Цей інтерфейс описує набір подій, які можуть бути викликані в процесі роботи клієнта.
 */
export interface ClientEvents {
    /**
     * Викликається при відключенні клієнта.
     * @param code - Код відключення.
     * @param err - Інформація про помилку, якщо вона є.
     */
    disconnected(code: number, err: Error | null): void;
    /**
     * Викликається при успішному підключенні клієнта.
     */
    connected(): void;
    /**
     * Викликається при виникненні помилки.
     * @param e - Об'єкт помилки.
     */
    error(e: Error): void;
    /**
     * Викликається при зміні статусу реєстрації телефону.
     * @param registered - Булевий статус реєстрації телефону.
     */
    phone_registered(registered: boolean): void;
    /**
     * Викликається при зміні статусу підключення телефону.
     * @param connected - Булевий статус підключення телефону.
     */
    phone_connected(connected: boolean): void;
    /**
     * Викликається для оновлення пропущених подій.
     * @param ev - Об'єкт, що містить інформацію про пропущені події.
     */
    refresh_missed(ev: object): void;
    /**
     * Викликається для відображення повідомлення.
     * @param ev - Об'єкт сповіщення.
     */
    show_message(ev: MessageNotification): void;
    screenshot(ev: MessageNotification): void;
    open_link(ev: MessageNotification): void;
    screen_rec_start(ev: MessageNotification): void;
    screen_rec_stop(ev: MessageNotification): void;
    /**
     * Викликається при отриманні SDP-повідомлення.
     * @param sock - Ідентифікатор сокету.
     * @param ev - Об'єкт події SDP.
     */
    sdp(sock: string, ev: SdpEvent): void;
    /**
     * Викликається при отриманні вхідного дзвінка.
     * @param call - Об'єкт дзвінка.
     */
    call_receive(call: Call): void;
    /**
     * Викликається при завершенні дзвінка.
     * @param call - Об'єкт дзвінка.
     */
    call_hangup(call: Call): void;
    [WEBSOCKET_EVENT_CALL_MEDIA_METRIC](rtp: RtpMetrics): void;
}
/**
 * Цей клас Client розширює EventEmitter, який використовується для керування подіями,
 * що описані в інтерфейсі ClientEvents. Він має декілька полів для збереження стану клієнта,
 * таких як agent, phone, lastError, lastLatency, а також деякі приватні поля для внутрішнього використання,
 * такі як socket, connectionInfo, reqSeq, queueRequest, log, eventHandler, callStore, conversationStore,
 * pingTimer, та toneTimer.
 * Конструктор класу приймає конфігураційні параметри, які використовуються для ініціалізації клієнта.
 */
export declare class Client extends EventEmitter<ClientEvents> {
    protected readonly _config: Config;
    agent: Agent;
    phone?: SipClient;
    lastError: null | Error;
    lastLatency: number | null;
    readonly basePath: string;
    private socket;
    private connectionInfo;
    private reqSeq;
    private queueRequest;
    private ackQueue;
    private log;
    private eventHandler;
    private callStore;
    private spyScreenSessions;
    private senderScreenStore;
    private conversationStore;
    private pingTimer;
    private toneTimer;
    private screenResolver;
    /**
     * Конструктор для створення екземпляра клієнта.
     *
     * @param _config - Конфігураційні параметри клієнта.
     */
    constructor(_config: Config);
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    subscribeCall(handler: CallEventHandler, data?: object): Promise<CallListResponse>;
    /**
     * Підписується на події чату.
     *
     * @param handler - Обробник подій чату.
     * @param data - Додаткові дані для підписки (необов'язково).
     */
    subscribeChat(handler: ChatEventHandler, data?: object): Promise<ConversationListResponse>;
    subscribeUsersStatus(handler: UsersStatusEventHandler, data?: object): Promise<object>;
    subscribeAgentsStatus(handler: AgentStatusEventHandler, data?: object): Promise<object>;
    getTask(id: number): Task | undefined;
    subscribeTask(handler: TaskEventHandler): void;
    subscribeJob(handler: JobEventHandler): void;
    unSubscribe(action: string, handler: CallEventHandler, data?: object): Promise<object>;
    destroy(): Promise<void>;
    allCall(): Call[];
    allConversations(): Conversation[];
    allTask(): Task[];
    allJob(): Task[];
    allSpyScreenSessions(): SpyScreen[];
    callById(id: string): Call | undefined;
    conversationById(id: string): Conversation | undefined;
    callBySipId(id: string): Call | undefined;
    reportingTask(attemptId: number, reporting: Reporting): Promise<object>;
    agentActiveTasks(agentId: number): Promise<object>;
    auth(): Promise<object>;
    ping(): Promise<any>;
    sessionInfo(): Session;
    get version(): string;
    get buildVersion(): string;
    get canUseChat(): boolean;
    get canUseCC(): boolean;
    get instanceId(): string;
    get autoAnswerDelayTime(): number;
    agentSession(): Promise<Agent>;
    invite(req: OutboundCallRequest): Promise<object>;
    call(req: OutboundCallRequest): Promise<void>;
    callRecordId(id: string): Promise<object>;
    eavesdrop(req: EavesdropRequest): Promise<object>;
    agentSetOnline(agentId: number, channels: string[], onDemand: boolean): Promise<object>;
    agentSetWaiting(agentId: number, channel: string): Promise<object>;
    agentSetPause(agentId: number, payload?: any): Promise<object>;
    agentSetOffline(agentId: number): Promise<object>;
    inviteToUser(req: UserCallRequest): Promise<object>;
    answer(id: string, req: AnswerRequest): Promise<boolean | undefined>;
    request(action: string, data?: object): Promise<object>;
    ackRequest(action: string, data?: object, timeout?: number): Promise<object>;
    useWebPhone(): boolean;
    callDestroyed(call: Call): boolean;
    conversationDestroyed(conv: Conversation): boolean;
    reportingChannelTask(task: Task): void;
    registerCallClient(phone: SipClient): Promise<void>;
    subscribePhone(phone: SipClient): void;
    phoneIsRegister(): boolean;
    deviceConfig(name?: string): Promise<object>;
    storeFile(id: string, files: File[], cb?: FileUploadProgress, channel?: string): Promise<StorageShareFile[]>;
    fileUrlDownload(fileId: number, mime: string): string;
    fileUrlStream(fileId: number, mime: string): string;
    handleError(e?: Error): void;
    destroyConversation(conv: Conversation): void;
    removeSpyScreen(id: string): boolean;
    spyScreen(agentId: number, conf: RTCConfiguration, cb: (m: MediaStream) => void, timeout?: number): Promise<void>;
    private onMessage;
    private handleNotification;
    private handleAgentStatus;
    private handleChannelEvents;
    private deadlinePingTime;
    private pingServer;
    private connected;
    private latency;
    private calculateLatency;
    private callBySession;
    private onCallInfoSession;
    private onNewCallSession;
    private checkAutoAnswer;
    private connectToSocket;
    private handleUserStateEvent;
    private handleCallEvents;
    private generateTone;
    private handleChatEvents;
    private hasAgentTask;
    private destroyCall;
    private fileUrlParams;
}
//# sourceMappingURL=client.d.ts.map