import type { Client } from './client';
import type { keyable } from './notification';
import { type ChannelEvent, type Distribute, Task } from './task';
/**
 * Інтерфейс, що представляє властивості абонента, який очікує на відповідь.
 * @interface
 */
export interface WaitingMemberProperties {
    deadline: number;
    queue: object;
    wait: number;
}
export interface WaitingMember extends WaitingMemberProperties {
    attempt_id: number;
    communication: keyable;
    channel: string;
    session_id: string;
}
/**
 * Інтерфейс, що представляє абонента, який очікує на відповідь від дзвінка.
 * @interface
 */
export interface WaitingMemberCall extends WaitingMemberProperties {
    attemptId: number;
    sessionId: string;
    displayName: string;
    displayNumber: string;
}
/**
 * Інтерфейс, що представляє абонента, який очікує на відповідь від чату.
 * @interface
 */
export interface WaitingMemberChat extends WaitingMemberProperties {
    attemptId: number;
    sessionId: string;
    message: string;
    displayName: string;
    peer: string;
    chat: string;
    member: object;
}
/**
 * Інтерфейс, що представляє канал зв'язку.
 * @interface
 */
export interface Channel {
    channel: ChannelType;
    state: string;
    joined_at: number;
    timeout?: number;
    active: boolean;
    open: number;
    wrap_time_ids: number[];
}
/**
 * Інтерфейс, що представляє сесію агента.
 * @interface
 */
export interface AgentSession {
    agent_id: number;
    status: string;
    on_demand: boolean;
    last_status_change: number;
    status_duration: number;
    status_payload: any;
    status_comment: string;
    channels: Channel[];
    is_supervisor: boolean;
    is_admin: boolean;
    team: object | null;
    supervisor: object | null;
    auditor: object | null;
}
/**
 * Інтерфейс, що представляє відповідь на запит для сесії агента.
 * @interface
 */
export interface AgentSessionResponse extends AgentSession {
    task?: Distribute[];
}
/**
 * Інтерфейс, що представляє подію зміни статусу агента.
 * @interface
 */
export interface AgentStatusEvent {
    user_id: number;
    agent_id: number;
    timestamp: number;
    status: string;
    status_comment: string;
    status_payload?: any;
    timeout?: number;
    channels: Channel[];
    on_demand?: boolean;
}
/**
 * Перелік статусів агента.
 * @enum {string}
 */
export declare enum AgentStatus {
    /**
     * Агент онлайн.
     */
    Online = "online",
    /**
     * Агент офлайн.
     */
    Offline = "offline",
    /**
     * Агент на паузі.
     */
    Pause = "pause",
    /**
     * Агент у перерві.
     */
    BreakOut = "break_out"
}
/**
 * Перелік станів каналу зв'язку.
 * @enum {string}
 */
export declare enum ChannelState {
    /**
     * Канал очікує.
     */
    Waiting = "waiting",
    /**
     * Канал розподіляється (дзвінок дзвонить).
     */
    Distribute = "distribute",
    /**
     * Канал пропонує (дзвінок дзвонить).
     */
    Offering = "offering",
    /**
     * Канал відповів на дзвінок.
     */
    Answered = "answered",
    /**
     * Канал активний.
     */
    Active = "active",
    /**
     * Канал з'єднаний.
     */
    Bridged = "bridged",
    /**
     * Канал на утриманні.
     */
    Hold = "hold",
    /**
     * Канал пропущено.
     */
    Missed = "missed",
    /**
     * Канал у часі обробки.
     */
    WrapTime = "wrap_time",
    /**
     * Канал обробляється.
     */
    Processing = "processing",
    /**
     * Канал у процесі передачі.
     */
    Transfer = "transfer",
    /**
     * Канал заповнюється формою.
     */
    Form = "form"
}
/**
 * Перелік типів каналів зв'язку.
 * @enum {string}
 */
export declare enum ChannelType {
    /**
     * Тип каналу - дзвінок.
     */
    Call = "call",
    /**
     * Тип каналу - електронна пошта.
     */
    Email = "email",
    /**
     * Тип каналу - чат.
     */
    Chat = "chat",
    /**
     * Тип каналу - завдання (планується перейменування на job).
     */
    Job = "task",
    /**
     * Тип каналу - вихідний дзвінок.
     */
    OutCall = "out_call",
    IM = "im"
}
/**
 * Інтерфейс, що представляє відключеного абонента.
 * @interface
 */
type OfflineMember = {
    id: number;
    [key: string]: any;
};
/**
 * Інтерфейс, що представляє список відключених членів.
 * @interface
 */
export interface OfflineMemberList {
    items: OfflineMember[];
    next?: boolean;
}
/**
 * Клас Agent: Використовується для представлення агента, що виконує завдання,
 * чати та дзвінки, а також управляє каналами та офлайн-учасниками.
 *
 * Конструктор Agent:
 *  client: Клієнт, що керує цим агентом. Використовується для доступу до зовнішніх ресурсів та методів.
 *  info: Інформація про сесію агента, що включає дані, специфічні для агента, такі як статус, ідентифікатори тощо.
 *  Конструктор ініціалізує всі властивості класу, встановлюючи значення за замовчуванням
 *  або порожні об'єкти для управління різними аспектами роботи агента.
 */
export declare class Agent {
    protected readonly client: Client;
    protected info: AgentSession;
    task: Map<number, Task>;
    maxWaitingListChats: number;
    waitingListChats: WaitingMemberChat[];
    waitingListCalls: WaitingMemberCall[];
    _channels: Map<string, Channel>;
    _listOfflineMembers: OfflineMemberList | null;
    lastStatusChange: number;
    /**
     * Конструктор класу Agent.
     * @constructor
     * @param {Client} client - Клієнт.
     * @param {AgentSession} info - Сесія агента.
     */
    constructor(client: Client, info: AgentSession);
    /**
     * Метод, що повертає ідентифікатор агента.
     * @method
     * @returns {number} - Ідентифікатор агента.
     */
    get agentId(): number;
    /**
     * Метод, що повертає статус "On Demand".
     * @method
     * @returns {boolean} - Статус "On Demand".
     */
    get onDemand(): boolean;
    /**
     * Метод, що повертає статус агента.
     * @method
     * @returns {string} - Статус агента.
     */
    get status(): string;
    /**
     * Метод, що повертає додаткову інформацію про статус агента.
     * @method
     * @returns {any} - Додаткова інформація про статус агента.
     */
    get statusPayload(): any;
    get statusComment(): string;
    /**
     * Метод, що повертає, чи є агент адміністратором.
     * @method
     * @returns {boolean} - Чи є агент адміністратором.
     */
    get isAdmin(): boolean;
    /**
     * Метод, що повертає, чи є агент супервайзером.
     * @method
     * @returns {boolean} - Чи є агент супервайзером.
     */
    get isSupervisor(): boolean;
    /**
     * Метод, що повертає команду агента.
     * @method
     * @returns {object | null} - Команда агента.
     */
    get team(): object | null;
    /**
     * Метод, що повертає супервайзера агента.
     * @method
     * @returns {object | null} - Супервайзер агента.
     */
    get supervisor(): object | null;
    /**
     * Метод, що повертає аудитора агента.
     * @method
     * @returns {object | null} - Аудитор агента.
     */
    get auditor(): object | null;
    /**
     * Метод, що повертає список каналів зв'язку.
     * @method
     * @returns {Channel[]} - Список каналів зв'язку.
     */
    get channels(): Channel[];
    /**
     * Метод, що повертає канал зв'язку.
     * @method
     * @returns {Channel | undefined} - Канал зв'язку.
     */
    get channel(): Channel | undefined;
    /**
     * Метод, що повертає тривалість стану.
     * @method
     * @returns {number} - Тривалість стану.
     */
    get stateDuration(): number;
    /**
     * Метод, що встановлює список членів, які очікують на відповідь.
     * @method
     * @param {keyable | undefined} e - Об'єкт зі списком членів, які очікують на відповідь.
     */
    setWaitingList(e: keyable | undefined): void;
    /**
     * Метод, що видаляє спробу очікування на відповідь.
     * @method
     * @param {keyable | undefined} e - Об'єкт зі списком членів, які очікують на відповідь.
     */
    deleteWaitingAttempt(e: keyable | undefined): void;
    /**
     * Метод, що перехоплює спробу.
     * @method
     * @param {number} id - Ідентифікатор спроби.
     * @returns {Promise<any>} - Результат запиту.
     */
    interceptAttempt(id: number): Promise<object>;
    /**
     * Метод, що обробляє подію каналу зв'язку.
     * @method
     * @param {ChannelEvent} e - Подія каналу зв'язку.
     * @returns {Task | undefined | BaseError | PauseNotAllowedError} - Задача, помилка або undefined.
     */
    onChannelEvent(e: ChannelEvent): Task | undefined;
    /**
     * Метод, що встановлює статус "Online" для агента.
     * @method
     * @param {string[]} channels - Список каналів зв'язку.
     * @param {boolean} onDemand - Статус "On Demand".
     * @returns {Promise<any>} - Об'єкт з інформацією про сесію агента.
     */
    online(channels: string[], onDemand: boolean): Promise<object>;
    /**
     * Метод, що встановлює статус "Waiting" для агента.
     * @method
     * @param {string} channel - Канал зв'язку.
     * @returns {Promise<any>} - Об'єкт з інформацією про сесію агента.
     */
    waiting(channel: string): Promise<object>;
    /**
     * Метод, що встановлює статус "Pause" для агента.
     * @method
     * @param {any} payload - Додаткова інформація про статус "Pause".
     * @returns {Promise<any>} - Об'єкт з інформацією про сесію агента або об'єкт помилки.
     * Якщо статус "Pause" не дозволений, повертається об'єкт помилки PauseNotAllowedError.
     */
    pause(payload?: any): Promise<object>;
    /**
     * Метод, що встановлює статус "Offline".
     * @method
     * @returns {Promise<any>} - Результат запиту.
     */
    offline(): Promise<object>;
    /**
     * Метод, що обмежує список членів, які очікують на відповідь від чату.
     * @method
     * @param {number} limit - Ліміт.
     */
    limitWaitingListChats(limit: number): void;
    /**
     * Метод, що встановлює статус агента.
     * @method
     * @param {AgentStatusEvent} e - Подія зміни статусу агента.
     */
    setStatus(e: AgentStatusEvent): void;
    /**
     * Метод, що направляє абонента.
     * @method
     * @param {number} memberId - Ідентифікатор абонента.
     * @param {number} communicationId - Ідентифікатор зв'язку.
     * @returns {Promise<any>} - Результат запиту.
     */
    directMember(memberId: number, communicationId: number): Promise<object>;
    /**
     * Метод, що повертає список відключених абонентів.
     * @method
     * @param {string} q - Пошуковий запит.
     * @param {number} page - Номер сторінки.
     * @param {number} perPage - Кількість елементів на сторінці.
     * @returns {Promise<OfflineMemberList>} - Список абонентів із офлайн черги.
     */
    offlineMembers(q: string, page: number, perPage: number): Promise<OfflineMemberList>;
    /**
     * Метод, що перевіряє, чи має задачу агент.
     * @method
     * @param {Task} task - Задача.
     * @returns {boolean} - true, якщо агент має задачу, false - якщо ні.
     */
    hasTask(task: Task): boolean;
    private initChannels;
    private getChannel;
    private setChannelState;
    private setChannelStateTimeout;
}
export {};
//# sourceMappingURL=agent.d.ts.map