"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPod = getPod;
exports.getPodOwner = getPodOwner;
exports.getName = getName;
exports.throttle = throttle;
/*
    Copied from mashlib/src/global/metadata.ts
 */
const rdflib_1 = require("rdflib");
const __1 = require("..");
/**
 * @ignore exporting this only for the unit test
 */
function getPod() {
    // @@ TODO: This is given that mashlib runs on NSS - might need to change when we want it to run on other Pod servers
    return (0, rdflib_1.sym)(document.location.origin).site();
}
/**
 */
async function getPodOwner(pod, store) {
    // This is a massive guess.  In future
    // const podOwner = sym(`${pod.uri}profile/card#me`)
    /* eslint-disable no-console */
    try {
        // load turtle Container representation
        if (!store.any(pod, null, __1.ns.ldp('Container'), pod)) {
            const response = await store.fetcher.webOperation('GET', pod.uri, store.fetcher.initFetchOptions(pod.uri, { headers: { accept: 'text/turtle' } }));
            const containerTurtle = response.responseText;
            (0, rdflib_1.parse)(containerTurtle, store, pod.uri, 'text/turtle');
        }
    }
    catch (err) {
        console.error('Error loading pod ' + pod + ': ' + err);
        return null;
    }
    if (!store.holds(pod, __1.ns.rdf('type'), __1.ns.space('Storage'), pod)) {
        console.warn('Pod  ' + pod + ' does not declare itself as a space:Storage');
        return null;
    }
    const podOwner = store.any(pod, __1.ns.solid('owner'), null, pod) ||
        store.any(null, __1.ns.space('storage'), pod, pod);
    if (podOwner) {
        try {
            await store.fetcher.load(podOwner.doc());
        }
        catch (err) {
            console.warn('Unable to load profile of pod owner ' + podOwner);
            return null;
        }
        if (!store.holds(podOwner, __1.ns.space('storage'), pod, podOwner.doc())) {
            console.warn(`Pod owner ${podOwner} does NOT list pod ${pod} as their storage`);
        }
        return podOwner; // Success!
    }
    else { // pod owner not declared in pod
        // @@ TODO: This is given the structure that NSS provides
        // This is a massive guess.  For old pods which don't have owner link
        const guess = (0, rdflib_1.sym)(`${pod.uri}profile/card#me`);
        try {
            // @ts-ignore  LiveStore always has fetcher
            await store.fetcher.load(guess);
        }
        catch (err) {
            console.error('Ooops. Guessed wrong pod owner webid {$guess} : can\'t load it.');
            return null;
        }
        if (store.holds(guess, __1.ns.space('storage'), pod, guess.doc())) {
            console.warn('Using guessed pod owner webid but it links back.');
            return guess;
        }
        return null;
    }
    /* eslint-enable no-console */
}
/**
 * @ignore exporting this only for the unit test
 */
function getName(store, user) {
    return store.anyValue(user, __1.ns.vcard('fn'), null, user.doc()) ||
        store.anyValue(user, __1.ns.foaf('name'), null, user.doc()) ||
        user.uri;
}
/**
 * @ignore exporting this only for the unit test
 */
function throttle(func, wait, options = {}) {
    let context, args, result;
    let timeout = null;
    let previous = 0;
    const later = function () {
        previous = !options.leading ? 0 : Date.now();
        timeout = null;
        result = func.apply(context, args);
        if (!timeout)
            context = args = null;
    };
    return function () {
        const now = Date.now();
        if (!previous && !options.leading)
            previous = now;
        const remaining = wait - (now - previous);
        // @ts-ignore
        context = this;
        args = arguments;
        if (remaining <= 0 || remaining > wait) {
            if (timeout) {
                clearTimeout(timeout);
                timeout = null;
            }
            previous = now;
            result = func.apply(context, args);
            if (!timeout)
                context = args = null;
        }
        else if (!timeout && options.trailing !== false) {
            timeout = setTimeout(later, remaining);
        }
        return result;
    };
}
//# sourceMappingURL=headerFooterHelpers.js.map