import { StreamedMetaSchema } from '@duydang2311/ragemp-utils-meta';
import { EntityType } from '@duydang2311/ragemp-utils-shared';

interface LocalMarker {
    type: RageEnums.Markers;
    position: IVector3;
    destination: IVector3;
    rotation: IVector3;
    scale: IVector3;
    radius: number;
    color: RGBA;
    bobUpAndDown: boolean;
    faceCamera: boolean;
    rotate: boolean;
    textureDict: string | null;
    textureName: string | null;
    drawOnEnts: boolean;
    render(): void;
}
declare class RageMpLocalMarker implements LocalMarker {
    #private;
    constructor(type: RageEnums.Markers, position: IVector3, destination: IVector3, rotation: IVector3, scale: IVector3, radius: number, color: RGBA, bobUpAndDown?: boolean, faceCamera?: boolean, rotate?: boolean, textureDict?: string | null, textureName?: string | null, drawOnEnts?: boolean);
    get type(): number;
    get position(): IVector3;
    get destination(): IVector3;
    get rotation(): IVector3;
    get scale(): IVector3;
    get radius(): number;
    get color(): RGBA;
    get bobUpAndDown(): boolean;
    get faceCamera(): boolean;
    get rotate(): boolean;
    get textureDict(): string | null;
    get textureName(): string | null;
    get drawOnEnts(): boolean;
    set type(value: number);
    set position(value: IVector3);
    set destination(value: IVector3);
    set rotation(value: IVector3);
    set scale(value: IVector3);
    set radius(value: number);
    set color(value: RGBA);
    set bobUpAndDown(value: boolean);
    set faceCamera(value: boolean);
    set rotate(value: boolean);
    set textureDict(value: string | null);
    set textureName(value: string | null);
    set drawOnEnts(value: boolean);
    render(): void;
}

type StreamedMetaOnChangeFn<V> = (entity: EntityMp, currentValue: V | undefined, previousValue: V | undefined) => void;
interface StreamedMetaStore {
    init(): void;
    on<K extends keyof StreamedMetaSchema, V extends StreamedMetaSchema[K]>(eventName: 'change', name: K, fn: StreamedMetaOnChangeFn<V>): () => void;
}
interface CreateRageMpStreamedMetaStoreOptions {
    entityTypes?: Exclude<EntityType, 'blip' | 'dummy'>[];
    changeEventName?: string;
    streamedInEventName?: string;
    streamedOutEventName?: string;
    debug?: boolean;
}
declare class RageMpStreamedMetaStore implements StreamedMetaStore {
    #private;
    constructor(options?: CreateRageMpStreamedMetaStoreOptions);
    init(): void;
    on<K extends keyof StreamedMetaSchema, V extends StreamedMetaSchema[K]>(eventName: 'change', name: K, fn: StreamedMetaOnChangeFn<V>): () => void;
}

declare const renderPromise: <T>(fn: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) => Promise<T>;

export { type CreateRageMpStreamedMetaStoreOptions, type LocalMarker, RageMpLocalMarker, RageMpStreamedMetaStore, type StreamedMetaOnChangeFn, type StreamedMetaStore, renderPromise };
