import utils from './utils.js';
import treeCache from "./tree_cache.js";

const $tree = $("#tree");

function getParentProtectedStatus(node) {
    return utils.isRootNode(node) ? 0 : node.getParent().data.isProtected;
}

function getNodeByKey(key) {
    return $tree.fancytree('getNodeByKey', key);
}

function getNoteIdFromNotePath(notePath) {
    if (!notePath) {
        return null;
    }

    const path = notePath.split("/");

    return path[path.length - 1];
}

function getNotePath(node) {
    const path = [];

    while (node && !utils.isRootNode(node)) {
        if (node.data.noteId) {
            path.push(node.data.noteId);
        }

        node = node.getParent();
    }

    path.push('root');

    return path.reverse().join("/");
}

async function getNoteTitle(noteId, parentNoteId = null) {
    utils.assertArguments(noteId);

    const note = await treeCache.getNote(noteId);
    if (!note) {
        return "[not found]";
    }

    let {title} = note;

    if (parentNoteId !== null) {
        const branch = await treeCache.getBranchByChildParent(noteId, parentNoteId);

        if (branch && branch.prefix) {
            title = branch.prefix + ' - ' + title;
        }
    }

    return title;
}

async function getNotePathTitle(notePath) {
    utils.assertArguments(notePath);

    const titlePath = [];

    if (notePath.startsWith('root/')) {
        notePath = notePath.substr(5);
    }

    // special case when we want just root's title
    if (notePath === 'root') {
        return await getNoteTitle(notePath);
    }

    let parentNoteId = 'root';

    for (const noteId of notePath.split('/')) {
        titlePath.push(await getNoteTitle(noteId, parentNoteId));

        parentNoteId = noteId;
    }

    return titlePath.join(' / ');
}

export default {
    getParentProtectedStatus,
    getNodeByKey,
    getNotePath,
    getNoteIdFromNotePath,
    getNoteTitle,
    getNotePathTitle,
};