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";
import { FlockOptions } from "../data/flock-options.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;

    /**
     * Enable flock mode globally
     * @param options FlockOptions
     */
    enableFlockMode: (options?: FlockOptions) => void;

    /**
     * Disable flock mode globally
     */
    disableFlockMode: () => void;

    /**
     * Start/join a flock session by following the given user
     * @param userId The leader user ID
     * @param name The leader user name
     */
    startFollowingUser: (userId: string, name: string) => void;

    /**
     * Exit the flock session / stop following
     */
    stopFollowingUser: () => void;

    /**
     * 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;

    /**
     * Enable flock mode globally
     */
    private _enableFlockMode;

    /**
     * Disable flock mode globally
     */
    private _disableFlockMode;

    /**
     * Start/join a flock session by following the given user
     */
    private _startFollowingUser;

    /**
     * Exit the flock session / stop following
     */
    private _stopFollowingUser;

    /**
     * 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;
}
