import * as THREE from 'three';
import { State } from '../types/state';
import { Pano } from './pano';
import { Mode } from '../application/mode';
import { NetWorkMeta, NetworkType, NetworkState } from './ajax';
import { Works, Work } from '../work';
import { ModelScene, Model } from '../model';
import { type Tile } from '../model/tile3d/tile';
import { Intersection } from '../model/intersection';
import { MovePanoOptions } from '../types/movePanoOptions';
/** 所有事件的基础接口 */
export interface BaseEvent {
    /** 事件类型名称 */
    type: string;
    /** 事件触发时的时间戳 */
    timeStamp: number;
    /** 阻止事件的默认行为 */
    preventDefault(): void;
    /** 是否已调用过 preventDefault */
    readonly defaultPrevented: boolean;
}
export interface BaseExtendableEvent extends BaseEvent {
    waitUntil(f: Promise<any>): void;
}
/** 射线检测事件 */
export interface IntersectEvent extends BaseEvent {
    /** 被检测到的 3D 对象 */
    object: THREE.Object3D;
    /** 发出射线的 Raycaster */
    raycaster: THREE.Raycaster;
    /** 射线与对象的交点信息，未命中时为 null */
    intersection: Intersection | null;
}
/** 状态变更事件 */
export interface StateEvent extends BaseEvent {
    /** 当前的 Five 状态 */
    state: State;
    /** 是否由用户交互触发 */
    userAction: boolean;
}
/** 全景图切换事件 */
export interface PanoEvent extends StateEvent {
    /** 切换前的全景图 */
    prevPano: Pano;
    /** 新的全景图 */
    pano: Pano;
    /** 切换动画进度（0-1） */
    progress: number;
    /** 切换时传入的选项 */
    options: MovePanoOptions;
    /** 切换过程中发生的错误 */
    error: Error | null;
}
/** 全景图准备事件 */
export interface PanoPrepareEvent extends BaseExtendableEvent {
    /** 切换前的全景图 */
    prevPano: Pano;
    /** 新的全景图 */
    pano: Pano;
}
/** 全景图纹理加载事件 */
export interface PanoTextureEvent extends BaseEvent {
    /** 对应的全景图 */
    pano: Pano;
    /** 纹理加载进度（0-1） */
    progress: number;
    /** 网络请求元信息 */
    meta: NetWorkMeta[] | null;
    /** 加载过程中发生的错误 */
    error: Error | null;
}
/** 单个触控点 / 鼠标指针的信息 */
export interface GesturePointer {
    /** 指针在屏幕上的 x 坐标（像素） */
    x: number;
    /** 指针在屏幕上的 y 坐标（像素） */
    y: number;
    /** 相对上一帧的位移量 */
    delta: number;
    /** 当前按下的鼠标键（单键编号） */
    button: number;
    /** 当前按下的所有鼠标键（位掩码） */
    buttons: number;
    shiftKey: boolean;
    ctrlKey: boolean;
    altKey: boolean;
    metaKey: boolean;
    /** 归一化设备坐标（NDC） */
    coords: THREE.Vector2;
    /** 从该指针位置发出的射线 */
    raycaster: THREE.Raycaster;
}
/** 手势事件，涵盖触摸、鼠标、笔等输入方式 */
export interface GestureEvent extends StateEvent {
    /** 事件的原始 DOM 目标 */
    target: EventTarget | null;
    /** 输入设备类型 */
    pointerType: 'touch' | 'pen' | 'mouse' | 'kinect';
    /** 原始 DOM 事件 */
    srcEvent: MouseEvent | TouchEvent | PointerEvent;
    /** 所有活跃指针的信息列表 */
    pointers: GesturePointer[];
    /** 是否为该手势序列的第一个事件 */
    isFirst: boolean;
    /** 是否为该手势序列的最后一个事件 */
    isFinal: boolean;
    /** 多指缩放比例 */
    scale: number;
    /** 所有活跃指针的中心点信息 */
    center: GesturePointer;
    /** 当前 x 方向速度 */
    velocityX: number;
    /** 当前 y 方向速度 */
    velocityY: number;
    /** 整个手势序列的 x 方向平均速度 */
    overallVelocityX: number;
    /** 整个手势序列的 y 方向平均速度 */
    overallVelocityY: number;
}
/** XR 会话事件（进入/退出 XR 模式时触发） */
export interface XRSessionEvent extends BaseEvent {
    /** 当前 XR 会话 */
    session: XRSession | null;
    /** XR 设备类型 */
    machineType: 'Pico' | 'Oculus';
}
/** XR 控制器状态 */
export interface XRControllerState {
    /** 摇杆轴输入（0-1） */
    axes: Record<'up' | 'down' | 'left' | 'right', number>;
    /** 左手控制器射线 */
    raycaster: THREE.Raycaster;
    /** 距上一帧的时间间隔 */
    deltaTime: number;
}
/** XR 控制器输入事件 */
export interface XRControllerEvent extends BaseEvent {
    /** 左手控制器状态 */
    left: XRControllerState;
    /** 右手控制器状态 */
    right: XRControllerState;
    /** 各按键的按下状态 */
    buttons: {
        X: boolean;
        Y: boolean;
        LeftTrigger: boolean;
        LeftPinch: boolean;
        A: boolean;
        B: boolean;
        RightTrigger: boolean;
        RightPinch: boolean;
    };
}
/** XR 手势事件（按键、摇杆方向等离散输入） */
export interface XRGestureEvent extends BaseEvent {
    /** 当前 XR 会话 */
    session: XRSession | null;
    /** 触发该手势的按键或摇杆方向 */
    buttons: 'A' | 'B' | 'X' | 'Y' | 'RightTrigger' | 'RightPinch' | 'LeftTrigger' | 'LeftPinch' | 'LeftAxesLeft' | 'LeftAxesRight' | 'LeftAxesUp' | 'LeftAxesDown' | 'RightAxesLeft' | 'RightAxesRight' | 'RightAxesUp' | 'RightAxesDown';
    /** XR 设备类型 */
    machineType: 'Pico' | 'Oculus';
    /** 是否为该手势序列的第一个事件 */
    isFirst: boolean;
    /** 是否为该手势序列的最后一个事件 */
    isFinal: boolean;
    /** 控制器射线信息 */
    controllers: {
        raycaster: {
            leftRay: THREE.Raycaster;
            rightRay: THREE.Raycaster;
        };
    };
}
export interface WorksEvent extends BaseEvent {
    input: any;
    works: Works;
    userAction: boolean;
}
export interface ModelSceneEvent extends BaseEvent {
    modelScene: ModelScene;
}
export interface ModelEvent extends BaseEvent {
    model: Model;
    work: Work;
    error: Error | null;
}
export interface ModelTileEvent extends BaseEvent {
    model: Model;
    work: Work;
    tile: Tile;
}
export interface ModeChangeEvent extends StateEvent {
    prevMode: Mode;
    mode: Mode;
}
export interface RenderEvent extends BaseEvent {
    needsRender: boolean;
}
export interface ObjectEvent extends BaseEvent {
    object: THREE.Object3D;
}
export interface NetworkResourceEvent extends BaseEvent {
    source: string;
    requestType: NetworkType;
    requestState: NetworkState;
    detail: string;
}
export declare function createEvent<T extends BaseEvent = BaseEvent>(type: string, eventArgs: Omit<T, keyof BaseEvent>): T;
export declare function createExtendableEvent<T extends BaseExtendableEvent = BaseExtendableEvent>(type: string, eventArgs: Omit<T, keyof BaseExtendableEvent>): T;
export declare function waitForExtendableEvent(event: BaseExtendableEvent): Promise<void>;
