// view_tree — pure folder-depth walk. See view_tree.h.

#include "view_tree.h"

namespace reasampler {

FolderTree buildFolderTree(const std::vector<TrackFolderEntry>& entries) {
    FolderTree tree;
    tree.nodes.reserve(entries.size());

    // Stack of currently-open folder-parent GUIDs. The top is the immediate parent
    // of the next track. A folder-parent track opens its folder AFTER contributing
    // its own node (its own parent is the enclosing folder), so the push trails the
    // assignment. A closing track belongs to the folder it closes, so the pop also
    // trails the assignment.
    std::vector<std::string> open;

    for (const TrackFolderEntry& e : entries) {
        FolderNode node;
        node.guid       = e.guid;
        node.parentGuid = open.empty() ? std::string{} : open.back();
        node.isParent   = e.folderDepth == 1;
        tree.nodes.push_back(node);

        if (e.folderDepth == 1) {
            open.push_back(e.guid);  // this track's folder opens for what follows
        } else if (e.folderDepth < 0) {
            // Closes |folderDepth| levels after this (already-assigned) track.
            // Clamp to the stack size so a malformed/stale depth stream can't
            // underflow — the walk stays total.
            int levels = -e.folderDepth;
            while (levels-- > 0 && !open.empty()) {
                open.pop_back();
            }
        }
    }

    return tree;
}

} // namespace reasampler
