/**
 * 格式化菜单
 * @param list
 * @param idStr
 * @returns
 */
export function formatMenuList(list, idStr) {
  const arr =
    list &&
    list.map((item) => {
      if (idStr) {
        item.id = `${idStr}-${item.id}`;
      }
      if (item.children) {
        const childrenArr = formatMenuList(item.children, item.id);
        item.children = [...childrenArr];
      }
      item.key = item.id;
      item.value = item.id;
      item.title = item.name;
      return item;
    });
  return arr || [];
}

/**
 * 生成菜单项
 * @param menus
 * @param parentPath
 * @returns
 */
const loopMenuItem = (menus, parentPath) => {
  return menus.map(({ icon, children, ...item }) => {
    const currentPath = `${parentPath}${item.path}`;
    return {
      ...item,
      path: currentPath,
      icon: icon || null,
      children: children && loopMenuItem(children, currentPath),
    };
  });
};

/**
 * 生成不同端的路由配置
 * @param location
 * @param routes
 * @returns
 */
export function identifyRoute(routes: any[]) {
  const item = routes.find(({ path }) => path == "/") || { children: [] };
  return loopMenuItem(item.children || [], "");
}

/**
 * 过滤出有权限的路由
 * @param menus
 * @param marks
 * @returns
 */
const filterMenu = (menus: any[], marks: any[]) => {
  const menuList: any[] = [];
  menus.forEach((item: any) => {
    const { mark, children = [] } = item;
    if (Array.isArray(children)) {
      item.children = filterMenu(children, marks);
    }
    if (mark) {
      if (marks?.includes(mark)) {
        menuList.push(item);
      }
    } else {
      menuList.push(item);
    }
  });
  return menuList;
};

const transformTreeToArray = (tree) => {
  const array: any[] = [];
  tree.forEach((item: any) => {
    if (item && item.code) array.push(item.code);
    if (item.children) {
      array.push(...transformTreeToArray(item.children));
    }
  });
  return array;
};

export function getRouteByMarks(menus, marks) {
  return filterMenu(menus, transformTreeToArray(marks));
}

/**
 * 操作术语
 */
export const OperateMap = {
  add: "添加",
  edit: "编辑",
  detail: "",
};

// 格式
export const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm";
export const DATE_MONTH_FORMAT = "YYYY-MM";
export const DATE_MONTH_DATE = "YYYY-MM-DD";
