'use strict';

import * as chai from 'chai';
import {Link} from "../../../../source/dom/resource/link.mjs";
import {DataUrl} from "../../../../source/types/dataurl.mjs";
import {ID} from "../../../../source/types/id.mjs";
import {chaiDom} from "../../../util/chai-dom.mjs";
import {cleanupDOMFromTesting, initMutationObserverForTesting} from "../../../util/cleanupdom.mjs";
import {initJSDOM} from "../../../util/jsdom.mjs";

let expect = chai.expect;

chai.use(chaiDom);



describe('Link', function () {

    before(function (done) {
        initJSDOM().then(() => {
            done()
        });
    });

    beforeEach(() => {
        initMutationObserverForTesting()
    })

    afterEach(() => {
        cleanupDOMFromTesting();
    })

    describe('Link()', function () {
        this.timeout(5000);

        it('connect().available()', function (done) {

            const link = new Link({
                href: new DataUrl('', 'text/css').toString(),
                rel: 'stylesheet'
            });

            link.connect().available().then(() => {
                done()
            }).catch(e => done(e));

        })
    });

    describe('External Link', () => {
        this.timeout(5000);

        let id = new ID('link').toString();
        let link, url = new DataUrl('body{color:red;}', 'text/css').toString();

        beforeEach(() => {

            link = new Link({
                href: url,
                id: id,
                rel: 'stylesheet'
            });

        });

        const triggerLoad = () => {
            const node = document.getElementById(id);
            if (node) {
                node.dispatchEvent(new window.Event("load"));
            }
        };

        it('append and remove Link ', (done) => {

            expect(link.isConnected()).to.be.false;

            link.connect();
            triggerLoad();
            link.available().then(() => {
                expect(link.isConnected()).to.be.true;
                expect(document.querySelector('[href="' + url + '"]')).to.exist;

                document.getElementById(id).remove();
                expect(link.isConnected()).to.be.false;
                expect(document.querySelector('[href="' + url + '"]')).not.to.exist;

                link.connect();
                triggerLoad();
                link.available().then(() => {
                    expect(link.isConnected()).to.be.true;
                    expect(document.querySelector('[href="' + url + '"]')).to.exist;

                    document.getElementById(id).remove();
                    expect(document.querySelector('[href="' + url + '"]')).not.to.exist;
                    expect(link.isConnected()).to.be.false;

                    done()
                }).catch(e => done(e));


            }).catch(e => done(e));


        });


    });


});
