import $ from 'jquery';
import RSVP from 'rsvp';
import Service, {inject as service} from '@ember/service';
import config from 'ghost-admin/config/environment';

export default Service.extend({
    ajax: service(),
    ghostPaths: service(),

    // This is needed so we can disable it in unit tests
    testing: undefined,

    scriptPromises: null,

    init() {
        this._super(...arguments);
        this.scriptPromises = {};

        if (this.testing === undefined) {
            this.testing = config.environment === 'test';
        }
    },

    loadScript(key, url) {
        if (this.get('testing')) {
            return RSVP.resolve();
        }

        if (this.get(`scriptPromises.${key}`)) {
            // Script is already loaded/in the process of being loaded,
            // so return that promise
            return this.get(`scriptPromises.${key}`);
        }

        let ajax = this.get('ajax');
        let adminRoot = this.get('ghostPaths.adminRoot');

        let scriptPromise = ajax.request(`${adminRoot}${url}`, {
            dataType: 'script',
            cache: true
        });

        this.set(`scriptPromises.${key}`, scriptPromise);

        return scriptPromise;
    },

    loadStyle(key, url, alternate = false) {
        if (this.get('testing') || $(`#${key}-styles`).length) {
            return RSVP.resolve();
        }

        return new RSVP.Promise((resolve, reject) => {
            let link = document.createElement('link');
            link.id = `${key}-styles`;
            link.rel = alternate ? 'alternate stylesheet' : 'stylesheet';
            link.href = `${this.get('ghostPaths.adminRoot')}${url}`;
            link.onload = () => {
                if (alternate) {
                    // If stylesheet is alternate and we disable the stylesheet before injecting into the DOM,
                    // the onload handler never gets called. Thus, we should disable the link after it has finished loading
                    link.disabled = true;
                }
                resolve();
            };
            link.onerror = reject;

            if (alternate) {
                link.title = key;
            }

            $('head').append($(link));
        });
    }
});
