import utils from "./utils.js";
import server from "./server.js";

function getFileUrl(noteId) {
    return getUrlForDownload("api/notes/" + noteId + "/download");
}

function download(url) {
    if (utils.isElectron()) {
        const remote = utils.dynamicRequire('@electron/remote');

        remote.getCurrentWebContents().downloadURL(url);
    } else {
        window.location.href = url;
    }
}

function downloadFileNote(noteId) {
    const url = getFileUrl(noteId) + '?' + Date.now(); // don't use cache

    download(url);
}

async function openNoteExternally(noteId) {
    if (utils.isElectron()) {
        const resp = await server.post("notes/" + noteId + "/save-to-tmp-dir");

        const electron = utils.dynamicRequire('electron');
        const res = await electron.shell.openPath(resp.tmpFilePath);

        if (res) {
            // fallback in case there's no default application for this file
            open(getFileUrl(noteId), {url: true});
        }
    }
    else {
        window.location.href = getFileUrl(noteId);
    }
}

function downloadNoteRevision(noteId, noteRevisionId) {
    const url = getUrlForDownload(`api/notes/${noteId}/revisions/${noteRevisionId}/download`);

    download(url);
}

/**
 * @param url - should be without initial slash!!!
 */
function getUrlForDownload(url) {
    if (utils.isElectron()) {
        // electron needs absolute URL so we extract current host, port, protocol
        return getHost() + '/' + url;
    }
    else {
        // web server can be deployed on subdomain so we need to use relative path
        return url;
    }
}

function getHost() {
    const url = new URL(window.location.href);
    return url.protocol + "//" + url.hostname + ":" + url.port;
}

export default {
    download,
    downloadFileNote,
    openNoteExternally,
    downloadNoteRevision,
    getUrlForDownload
}
