// @ts-nocheck
import { Observable } from "rxjs";
import { PresenceUser } from "../data/presence-user.data.model";
import { GetPresenceDataResponse, PresenceEventTypesMap } from "../data/presence-events.data.model";
import { PresenceRequestQuery } from "../data/presence-actions.data.model";

export declare class PresenceElement {

    /**
     * Subscribe to a list of all online users who are either active or inactive on the current document.
     *
     * Returns Observable<PresenceUser[] | null>.
     * @deprecated This method is deprecated. Use `getData` method instead.
     */
    getOnlineUsersOnCurrentDocument: () => Observable<PresenceUser[] | null>;

    /**
     * To set inactivity time (Default value is 5 minutes)
     * @param time inactivity time in milliseconds
     */
    setInactivityTime: (time: number) => void;

    /**
     * Enables follow along mode globally
     * @param options {FollowOptions: {useHistoryAPI: boolean, onNavigate: (url: PageInfo) => void}}}
     */
    enableFollowAlongMode: (useHistoryAPI: boolean) => any;

    /**
     * To disable follow along mode
     */
    disableFollowAlongMode: () => any;

    /**
     * To enable adding self to the presence list
     */
    enableSelf: () => void;

    /**
     * To disable adding self to the presence list
     */
    disableSelf: () => void;

    /**
     * To get the presence data
     */
    getData: (query?: PresenceRequestQuery) => Observable<GetPresenceDataResponse>;

    /**
     * Subscribe to presence events
     */
    on: <T extends keyof PresenceEventTypesMap>(action: T) => Observable<PresenceEventTypesMap[T]>;

    /**
     * Add a custom user to the presence list (e.g., an AI agent).
     * The user will appear in presence alongside real users.
     * @param request Object containing user data with at least userId required.
     */
    addUser: (request: { user: Partial<PresenceUser>, localOnly?: boolean }) => void;

    /**
     * Remove a previously added custom user from the presence list.
     * @param request Object containing user data with at least userId required, and optional localOnly flag.
     * @param request.localOnly If true, user is only removed locally (not removed from DB). Default: false.
     */
    removeUser: (request: { user: Partial<PresenceUser>, localOnly?: boolean }) => void;

    constructor();
    /**
     * Subscribe to a list of all online users who are either active or inactive on the current document.
     *
     * Returns Observable<PresenceUser[] | null>.
     * @deprecated This method is deprecated. Use `getData` method instead.
     */
    private _getOnlineUsersOnCurrentDocument;

    /**
     * To set inactivity time (Default value is 5 minutes)
     * @param time inactivity time in milliseconds
     */
    private _setInactivityTime;

    /**
     * Enables follow along mode globally
     * @param options {FollowOptions: {useHistoryAPI: boolean, onNavigate: (url: PageInfo) => void}}}
     */
    private _enableFollowAlongMode;

    /**
     * To disable follow along mode
     */
    private _disableFollowAlongMode;

    /**
     * To enable adding self to the presence list
     */
    private _enableSelf;

    /**
     * To disable adding self to the presence list
     */
    private _disableSelf;

    /**
     * To get the presence data
     */
    private _getData;

    /**
     * Subscribe to presence events
     */
    private _on;

    /**
     * Add a custom user to the presence list
     */
    private _addUser;

    /**
     * Remove a custom user from the presence list
     */
    private _removeUser;
}
