/**
 * @module nodeUtils
 * Utilities to process scene nodes.
 */

/**
 * @typedef {Object} SceneNode
 * @property {String} label Required
 * @property {String} model
 * @property {Boolean} isMain
 * @property {Number|null} opacity
 * @property {SceneNode[]|null} children
 */

/**
 * @typedef {Object} NormalizedSceneNode
 * @property {String} label Required
 * @property {String} id
 * @property {String} model
 * @property {Boolean} isMain
 * @property {Number|null} opacity
 * @property {Boolean} active
 */

/**
 * 
 * @param {SceneNode} node 
 * @param {Array} flatList 
 * @param {Number} depth
 */
function traverse(node, flatList, depth = 1) {
    if (!node.label) {
        console.error("Node missing label:", node);
        return;
    }

    const normNode = {
        ...node,
        id: node.id ?? node.label,
        isMain: node.isMain ?? false,
        active: true,
    };
    if (node.model) {
       normNode.model = node.model; 
    }
    flatList.push({
        ...normNode,
        depth
    });
    if (node.children && Array.isArray(node.children)) {
        for(let child of node.children) {
            traverse(child, flatList, depth + 1);
        }
    }
}

/**
 * Create a flat list of nodes from
 * the nested structure in config
 * @param {Array} nodes
 * @returns {NormalizedSceneNode[]} A flat list of nodes
**/
export function normalizeNodes (nodes) {
    let flatList = [];
    traverse(nodes, flatList);

    return flatList;
}
