import { Cartesian2, Viewer, Entity } from 'cesium';

interface EventArgs {
    position?: Cartesian2;
    endPosition?: Cartesian2;
    startPosition?: Cartesian2;
    [name: string]: any;
}
type ListenCallback<T> = (movement: EventArgs, substance: T) => void;
type ExternalListenCallback = (movement: EventArgs, result: any) => void;
type EventType = 'LEFT_DOWN' | 'LEFT_UP' | 'LEFT_CLICK' | 'LEFT_DOUBLE_CLICK' | 'RIGHT_DOWN' | 'RIGHT_UP' | 'RIGHT_CLICK' | 'MIDDLE_DOWN' | 'MIDDLE_UP' | 'MIDDLE_CLICK' | 'MOUSE_MOVE' | 'WHEEL' | 'PINCH_START' | 'PINCH_MOVE' | 'PINCH_END';
declare class Subscriber {
    private _viewer;
    private _handler;
    private _eventCollection;
    private _externalEventCollection;
    private readonly _eventTypeList;
    private _moveDebounce;
    private _lastTime;
    private _enablePickResult;
    private _lastResult;
    private _enable;
    private _isDestroy;
    /**
     * 是否被销毁
     */
    get isDestroy(): boolean;
    /** 是否执行监听回调 */
    get enable(): boolean;
    set enable(val: boolean);
    constructor(viewer: Viewer, options?: {
        element?: HTMLCanvasElement;
        pickResult?: {
            enable: boolean;
            moveDebounce?: number;
        };
    });
    private _initListener;
    private _shouldUpdate;
    private _eventRegister;
    /**
     * @description 为Entity添加监听事件
     *
     * @event
     *
     * @param {Function} callback 需要相应的事件
     *
     * @param {EventType} eventType 事件类型
     */
    add(substances: Entity | Entity[], callback: ListenCallback<Entity>, eventType: EventType): void;
    /**
     * @description 添加特定事件，与add不同在于该事件不会过滤Entity
     * @param callback 事件处理函数
     * @param eventType 事件类型
     * @return {string} Event Id  事件移除时需要提供事件ID
     */
    addExternal(callback: ExternalListenCallback, eventType: EventType): string;
    /**
     *@description 移除指定Substance的相应事件
     * @param substances 需要移除事件的Substance
     * @param eventType 需要移除的时间类型
     */
    remove<T extends Entity>(substances: T | T[], eventType: EventType): void;
    removeExternal(ids: string | string[], eventType?: EventType): void;
    private _searchExternal;
    removeNative(viewer: Viewer, eventType: EventType): void;
    private convertCesiumEventType;
    destroy(): void;
}

export { type EventArgs, type EventType, type ExternalListenCallback, type ListenCallback, Subscriber, Subscriber as default };
