let treeData = [];

// 查找该条数据所处的层级深度
function getDeep(list, parentId, deep) {
  try {
    let pid = list.filter(i=>i.id == parentId)[0].parentId;
    deep++;
    if(pid != 0) {
      return getDeep(list, pid, deep);
    }else{
      return deep
    }
  } catch (error) {
    return deep;
  }
}


// 分组排序
function sort(list) {
  let array = [];
  list.filter(i=>!i.parentId).forEach(item=>{
    array = array.concat(child(list, item, []))
  })
  return array
}

function child(list, data, arr) {
  arr.push(data);
  if(data.hasChild) {
    list.filter(i=>i.parentId==data.id).forEach(item=>{
      return child(list, item, arr)
    })
  }
  return arr;
}

let render = function(result) {
  return treeData = sort(result.map(i=>{
    i.hasChild = result.filter(j=>j.parentId==i.id).length > 0; // 是否有下级
    i.deep = getDeep(result, i.parentId, 0); // 缩进层级
    i.open = false;
    i.isShow = true;
    return i;
  }));
}

let toggle = function(row) {
  // 关闭的时候，需要递归关闭下面全部子级
  let childId = []
  // 打开下级
  if(row.open) {
    childId = child(treeData, row, []).map(i=>i.id)
    childId.shift();
  }

  return treeData.map(i=>{
    if(i.id == row.id) {
      i.open = !i.open;
    }
    if(i.parentId == row.id) {
      i.isShow = !i.isShow;
    }
    if(childId.indexOf(i.id) > -1) {
      i.open = false;
      i.isShow = childId.indexOf(i.id) === -1
    }
    return i;
  })
  .filter(i=>i.isShow)
}


function getParentId(id, list, arr) {
  arr.unshift(id);
  const pid = list.filter(i=>id == i.id)[0].parentId;
  if(pid) {
    return getParentId(pid, list, arr)
  }else{
    return arr;
  }
}

 function buildTree(pid, list) {
   const data = list.filter(i=>pid == i.parentId);
   return data.length ? data.map(i=>{
     return {
       value: i.id,
       label: i.name,
       children: buildTree(i.id, list),
     }
   }) : undefined
 }



export default {
  render,
  toggle,
  getParentId,
  buildTree,
}