'use strict';

import {extend} from "../../source/data/extend.mjs";
import {getGlobal} from "../../source/types/global.mjs";
//import Storage from "dom-storage";

export const isBrowser = new Function("try {return this===window;}catch(e){ return false;}");
export const isNode = new Function("try {return this===global;}catch(e){return false;}");

let JSDOMExport = null;

/**
 * this helper function creates the dom stack in the node environment
 *
 * @return {Promise<unknown>|Promise<void>}
 */
function initJSDOM(options) {
    if (typeof window === "object" && window['DOMParser']) return Promise.resolve();


    const g = getGlobal();

    options = extend({}, {
        pretendToBeVisual: true,
        contentType: "text/html",
        includeNodeLocations: true,
        storageQuota: 10000000,
        runScripts: "dangerously",
        resources: "usable"
    }, options || {})

    return import("jsdom").then(({JSDOM}) => {
        JSDOMExport = JSDOM;
        const {window} = new JSDOM(`<html>
<head>
</head>
<body>
<div id="mocks"></div>
</body>`, options);

        g['window'] = window;
        
        return new Promise((resolve, reject) =>
            window.addEventListener("load", () => {

                [
                    'Blob',
                    'CSSStyleSheet',
                    'customElements',
                    'CustomEvent',
                    'document',
                    'Document',
                    'DocumentFragment',
                    'DOMParser',
                    'Element',
                    'ElementInternals',
                    'Event',
                    'EventTarget',
                    'getComputedStyle',
                    'HTMLButtonElement',
                    'HTMLCollection',
                    'HTMLDivElement',
                    'HTMLDocument',
                    'HTMLElement',
                    'HTMLFormElement',
                    'HTMLInputElement',
                    'HTMLScriptElement',
                    'HTMLSelectElement',
                    'HTMLTemplateElement',
                    'HTMLTextAreaElement',
                    'InputEvent',
                    'KeyboardEvent',
                    'MutationObserver',
                    'navigator',
                    'Node',
                    'NodeFilter',
                    'NodeList',
                    'self',
                    'ShadowRoot',
                    'XMLSerializer',
                ].forEach(key => {
                    g[key] = window[key]
                });

                import("dom-storage").then(({default: Storage}) => {
                    g.localStorage = new Storage(null, {strict: true});
                    g.sessionStorage = new Storage(null, {strict: true});

                    window['localStorage'] = g.localStorage;
                    window['sessionStorage'] = g.sessionStorage;

                    resolve(g);
                    
                }).catch(e => {
                    console.error(e);
                    reject(e);
                });

            })
        );


    });
}

export {initJSDOM, JSDOMExport}