/**
 * Created by Administrator on 2017/06/26.
 */

/**
 * 树结构数据转换成table所需类型。
 * @param tree 树结构数据类型
 * @param fields 字段映射 如： fields: [{field: 'node', map: 'id'}]
 *                其中field对应的是tree数据中数据，map为表格绑定对应数据。
 */
function treeToTable(tree,fields) {
    return makeData(tree, fields);
}

/**
 * 处理数据。
 */
function makeData(tree,fields) {
    let data = [];
    let level = 0;
    let oData = JSON.parse(JSON.stringify(tree));
    for (let row = 0; row < oData.length; row++) {
        for (let i = 0; i < fields.length; i++) {
            if (oData[row][fields[i].field] != undefined) {
                oData[row][fields[i].map] = oData[row][fields[i].field];
                oData[row][fields[i].field] = null;
            }
        }
        oData[row].firstR = "tr_Root_" + oData[0].id;
        oData[row].level = 0;
        oData[row].parentTr = "Root"
        if (oData[row].childNodes != undefined && oData[row].childNodes.length > 0) {
            oData[row].hasChild = true;
            foreachDataLevel(oData[row].childNodes, fields, oData[0].id, 0, "Root")
        } else {
            oData[row].hasChild = false;
        }
    }
    foreachData(oData, data);
    return data;
}

/**
 * 深度遍历数据。
 * @param oData 数结构对应数据
 * @param returnData 返回数据集合。
 */
function foreachData (oData,returnData) {
    let newRow;
    for(let row=0;row<oData.length;row++){
        newRow=deepCopy(oData[row]);
        returnData.push(newRow)
        if(oData[row].childNodes!=undefined&&oData[row].childNodes.length>0){
            foreachData(oData[row].childNodes,returnData)
        }
    }
}
/**
 * 遍历赋值。
 * @param source 遍历集合
 */
function deepCopy(source) {
    let newRow = {};
    for (var key in source) {
        newRow[key] = source[key];
    }
    return newRow;
}

/**
 * 表格需要的等级数据等相关数据的处理。
 * @param oData 树数据集合
 * @param fields 字段映射
 * @param firstID 跟目录id
 * @param level 等级
 * @param parentTrId 父节点id
 */
function foreachDataLevel(oData,fields,firstID,level,parentTrId) {
    level = parseInt(level) + 1;
    for (let row = 0; row < oData.length; row++) {
        for (let i = 0; i < fields.length; i++) {
            if (oData[row][fields[i].field] != undefined) {
                oData[row][fields[i].map] = oData[row][fields[i].field];
                oData[row][fields[i].field] = null;
            }
        }
        oData[row].level = level;
        oData[row].firstR = "tr_Root_" + firstID;
        oData[row].parentTr = "tr_" + parentTrId + "_" + oData[row].pid;
        if (oData[row].childNodes != undefined && oData[row].childNodes.length > 0) {
            oData[row].hasChild = true;
            foreachDataLevel(oData[row].childNodes, fields, firstID, level, oData[row].pid)
        } else {
            oData[row].hasChild = false;
        }
    }
}


export default treeToTable;
