import type { GLTF } from "three/examples/jsm/loaders/GLTFLoader.js";

import { AnimationUtils } from "../engine/engine_animation.js";
import { addComponent } from "../engine/engine_components.js";
import { ContextEvent, ContextRegistry } from "../engine/engine_context_registry.js";
import { Animation } from "./Animation.js";
import { Animator } from "./Animator.js";
import { GameObject } from "./Component.js";
import { PlayableDirector } from "./timeline/PlayableDirector.js";

ContextRegistry.registerCallback(ContextEvent.ContextCreated, args => {
    const autoplay = args.context.domElement.getAttribute("autoplay");
    if (autoplay !== undefined && (autoplay === "" || autoplay === "true" || autoplay === "1")) {
        if (args.files) {
            for (const file of args.files) {
                const hasAnimation = GameObject.foreachComponent(file.file.scene, comp => {
                    if (comp.enabled === false) return undefined;
                    if (comp instanceof Animation && comp.playAutomatically || comp instanceof Animator || comp instanceof PlayableDirector && comp.playOnAwake === true) {
                        return true;
                    }
                    else if (comp instanceof Animation) {
                        comp.playAutomatically = true;
                        return true;
                    }
                    else if (comp instanceof PlayableDirector) {
                        comp.playOnAwake = true;
                        return true;
                    }
                    return undefined;
                }, true);
                if (hasAnimation !== true) {
                    AnimationUtils.assignAnimationsFromFile(file.file as GLTF, {
                        createAnimationComponent: (obj, _clip) => {
                            return addComponent(obj, Animation);
                        },
                    });
                }
            }
        }
    }
});


