import { Light, Scene, Texture, WebGLRenderer } from "three";
import type { MaterialX as MX } from "./materialx.types.js";

export function preloadWasm(trigger: "immediately" | "network_idle"): Promise<void>;

export type MaterialXContext = {
    getTime?(): number;
    getFrame?(): number;
}

type EnvironmentTextureSet = {
    radianceTexture: Texture | null;
    irradianceTexture: Texture | null;
}

export declare const state: {
    materialXModule: MX.MODULE | null;
    materialXGenerator: any | null;
    materialXGenContext: any | null;
    materialXStdLib: any | null;
    materialXInitPromise: Promise<void> | null;
};

/** 
 * Wait for the MaterialX WASM module to be ready.
 */
export declare function ready(): Promise<void>;

/**
 * MaterialXEnvironment manages the environment settings for MaterialX materials.
 */
export declare class MaterialXEnvironment {
    static get(scene: Scene): MaterialXEnvironment | null;
    private static _environments: WeakMap<Scene, MaterialXEnvironment>;
    private static getEnvironment(scene: Scene): MaterialXEnvironment;

    private _lights: Array<Light>;
    private _lightData: any[] | null;
    private _lightCount: number;
    private _initializePromise: Promise<boolean> | null;
    private _isInitialized: boolean;
    private _lastUpdateFrame: number;
    private _scene: Scene;

    constructor(_scene: Scene);

    initialize(renderer: WebGLRenderer): Promise<boolean>;
    update(frame: number, scene: Scene, renderer: WebGLRenderer): void;
    reset(): void;

    get lights(): Array<Light>;
    get lightData(): any[] | null;
    get lightCount(): number;
    getTextures(material: any): EnvironmentTextureSet;

    private _pmremGenerator: any | null;
    private _renderer: WebGLRenderer | null;
    private _texturesCache: Map<Texture | null, EnvironmentTextureSet>;
    private _initialize(renderer: WebGLRenderer): Promise<boolean>;
    private _getTextures(texture: Texture | null | undefined): EnvironmentTextureSet;
    private updateLighting(collectLights?: boolean): void;
}
