import { initEngine } from "./engine/engine_init.js";
initEngine();
import "./engine/webcomponents/needle-engine.js";
import "./engine/engine_setup.js";
export * from "./engine/api.js";
export * from "./engine-components/api.js";
export * from "./engine-components-experimental/api.js";
export * from "./engine-schemes/api.js";

// make accessible for external javascript
import { Context, loadAsset, NeedleXRSession, onAfterRender, onBeforeRender, onClear, onDestroy, onInitialized, onStart, onUpdate, TypeStore, VERSION } from "./engine/api.js";
const Needle = {
    VERSION: VERSION,
    Context: Context,
    NeedleXRSession: NeedleXRSession,
    assets: {
        loadFromURL: loadAsset,
    },
    types: TypeStore,
    onStart: onStart,
    onUpdate: onUpdate,
    onBeforeRender: onBeforeRender,
    onAfterRender: onAfterRender,
    onInitializedContext: onInitialized,
    onDestroyContext: onDestroy,
    onClearContext: onClear,
} as const;

if (globalThis["Needle"]?.VERSION !== undefined) {
    console.warn(`Needle Engine is already imported: ${globalThis["Needle"].VERSION}`);
}
function registerGlobal(obj: object) {
    for (const key in obj) {
        Needle[key] = obj[key];
    }
}
import * as Component from "./engine-components/Component.js";
registerGlobal(Component);

import * as Components from "./engine-components/codegen/components.js";
registerGlobal(Components);

import { GameObject } from "./engine-components/Component.js";
for (const method of Object.getOwnPropertyNames(GameObject)) {
    switch (method) {
        case "prototype":
        case "constructor":
        case "length":
        case "name":
            continue;
        default:
            Needle[method] = GameObject[method];
            break;
    }
}

if (!globalThis["Needle"]) {
    globalThis["Needle"] = Needle;
}
else {
    for (const key in Needle) {
        globalThis["Needle"][key] = Needle[key];
    }
}


// make three accessible
import * as THREE from "three";
if (!globalThis["THREE"]) {
    globalThis["THREE"] = THREE;
}
else console.warn("Three.js is already imported");

