/**
 * 包含parentId的数组转成树形结构数组
 * @param data 原始数据数组
 * @param idName ID属性名称
 * @param parentIdName 父ID属性名称
 * @returns {[]}
 */
const listToTree = function (data, idName, parentIdName) {
    if (!idName) {
        idName = 'id';
    }
    if (!parentIdName) {
        parentIdName = 'parentId';
    }

    // * 先生成parent建立父子关系
    const obj = {};
    data.forEach((item) => {
        obj[item[idName]] = item;
    });
    const parentList = [];
    data.forEach((item) => {
        // item.hasChildren = false;
        const parent = obj[item[parentIdName]];
        if (parent) {
            // * 当前项有父节点
            parent.children = parent.children || [];
            parent.children.push(item);
            // parent.hasChildren = true;
        } else {
            // * 当前项没有父节点 -> 顶层
            parentList.push(item);
        }
    });
    return parentList;
}

/**
 * 三元组转换成树形结构
 * @param nodes 节点数组
 * @param relations 关系数据
 * @param idName 节点ID属性名称
 * @param sourceName 关系起始节点ID属性名称
 * @param targetName 关系终止节点ID属性名称
 * @returns {[]}
 */
const tripletToTree = function ({nodes, relations, idName, sourceName, targetName}) {
    idName = idName ? idName : 'id';
    sourceName = sourceName ? sourceName : 'sourceId';
    targetName = targetName ? targetName : 'targetId';

    // * 先生成parent建立父子关系
    const nodeObj = {};
    nodes.forEach((item) => {
        nodeObj[item[idName]] = item;
    });
    const parentList = [];
    relations.forEach((item) => {
        // item.hasChildren = false;
        const parent = nodeObj[item[sourceName]];
        const child = nodeObj[item[targetName]];
        if (parent && child) {
            child.isChild = true;
            parent.children = parent.children || [];
            parent.children.push(nodeObj[item[targetName]]);
        }
        // parent.hasChildren = true;
    });
    Reflect.ownKeys(nodeObj).forEach(key => {
        if (!nodeObj[key].isChild) {
            parentList.push(nodeObj[key]);
        }
    });

    return parentList;
}

/**
 * 优先获取name，无则获取对象的第一个可用值
 * @param param
 * @returns {string}
 */
const getFirstStringProperty = function (param) {
    if (param.constructor == Array) {
        if (param.length > 0) {
            return getFirstStringProperty(param[0]);
        }
    } else if (param.constructor == Object) {
        if (param["name"]) {
            return getFirstStringProperty(param["name"]);
        } else if (Object.keys(param).length > 0) {
            return getFirstStringProperty(param[Object.keys(param)[0]]);
        }
    } else {
        return param.toString();
    }
    return '';
}


//格式化时间
function formatTime(dat) {
    //获取年月日，时间
    var year = dat.getFullYear();
    var mon = (dat.getMonth() + 1) < 10 ? "0" + (dat.getMonth() + 1) : dat.getMonth() + 1;
    var data = dat.getDate() < 10 ? "0" + (dat.getDate()) : dat.getDate();
    var hour = dat.getHours() < 10 ? "0" + (dat.getHours()) : dat.getHours();
    var min = dat.getMinutes() < 10 ? "0" + (dat.getMinutes()) : dat.getMinutes();
    var seon = dat.getSeconds() < 10 ? "0" + (dat.getSeconds()) : dat.getSeconds();

    var newDate = year + "-" + mon + "-" + data + " " + hour + ":" + min + ":" + seon;
    return newDate;
}

export {listToTree, tripletToTree, getFirstStringProperty, formatTime};
