import { SerializationContext } from "./engine_serialization_core.js";
import { Context } from "./engine_setup.js";
import type { ConstructorConcrete, GLTF, Model, SourceIdentifier, UIDProvider } from "./engine_types.js";
import { NEEDLE_components } from "./extensions/NEEDLE_components.js";


export interface INeedleGltfLoader {
    createBuiltinComponents(context: Context, gltfId: SourceIdentifier, gltf: GLTF, seed: number | null | UIDProvider, extension?: NEEDLE_components): Promise<void>
    writeBuiltinComponentData(comp: object, context: SerializationContext);
    parseSync(context: Context, data: string | ArrayBuffer, path: string, seed: number | UIDProvider | null): Promise<Model | undefined>;
    loadSync(context: Context, url: string, sourceId: string, seed: number | UIDProvider | null, prog?: (prog: ProgressEvent) => void): Promise<Model | undefined>
}

let gltfLoader: INeedleGltfLoader;
let gltfLoaderType: ConstructorConcrete<INeedleGltfLoader> | null = null;

export function getLoader(): INeedleGltfLoader {
    return gltfLoader;
}

export function registerLoader<T extends INeedleGltfLoader>(loader: ConstructorConcrete<T>) {
    if (loader === null || loader === undefined) {
        console.warn("Oh no: someone tried registering a non-existend gltf-loader. When you see this log it might mean that needle-engine is being imported multiple times. Please check your project setup.");
        return;
    }
    if (gltfLoaderType !== loader) {
        gltfLoaderType = loader;
        gltfLoader = new loader();
    }
}