/* global VirtualMachine, ScratchStorage, ScratchSVGRenderer */
/* eslint-env browser */

// Wait for all SVG skins to be loaded.
// TODO: this is extremely janky and should be removed once vm.loadProject waits for SVG skins to load
// https://github.com/LLK/scratch-render/issues/563
window.waitForSVGSkinLoad = renderer => new Promise(resolve => {
    // eslint-disable-next-line prefer-const
    let interval;

    const waitInner = () => {
        let numSVGSkins = 0;
        let numLoadedSVGSkins = 0;
        for (const skin of renderer._allSkins) {
            if (skin.constructor.name !== 'SVGSkin') continue;
            numSVGSkins++;
            if (skin._svgImage.complete) numLoadedSVGSkins++;
        }

        if (numSVGSkins === numLoadedSVGSkins) {
            clearInterval(interval);
            resolve();
        }
    };

    interval = setInterval(waitInner, 1);
});

window.loadFileInputIntoVM = (fileInput, vm, render) => {
    const reader = new FileReader();
    return new Promise(resolve => {
        reader.onload = () => {
            vm.start();
            vm.loadProject(reader.result)
                .then(() => window.waitForSVGSkinLoad(render))
                .then(() => {
                    resolve();
                });
        };
        reader.readAsArrayBuffer(fileInput.files[0]);
    });
};

window.initVM = render => {
    const vm = new VirtualMachine();
    const storage = new ScratchStorage.ScratchStorage();

    vm.attachStorage(storage);
    vm.attachRenderer(render);
    vm.attachV2SVGAdapter(ScratchSVGRenderer.V2SVGAdapter);
    vm.attachV2BitmapAdapter(new ScratchSVGRenderer.BitmapAdapter());

    return vm;
};