import { flatMap } from 'lodash';
import { fetchMenus, fetchModuleInfos, fetchModuleLayout } from '../services/modules';

const data = {
  flags: {
    menus: false,
    infos: false,
    layout: false,
  },
  menus: [],
  infos: [],
  layout: [],
};
export default data;

// export const setMenus = (menus) => {
//   data.init = true;
//   data.menus = menus;
// };

const combineMenu = (menu1, menu2) => {
  return {
    ...menu2,
    children: combineMenus(menu1.children, menu2.children),
  };
};

const combineMenus = (menus1, menus2) => {
  const menus = [...menus1];
  for (const menu of menus2) {
    let find = false;
    for (const i in menus) {
      if (menus[i].name === menu.name) {
        menus[i] = combineMenu(menus[i], menu);
        find = true;
        break;
      }
    }
    if (!find) {
      menus.push(menu);
    }
  }
  return menus;
};

export const getMenus = async () => {
  if (!data.flags.menus) {
    const context = require.context('../register/modules', true, /^.*\.(js|jsx|json)/);
    const staticMenus = flatMap(context.keys(), context);
    const dynamicMenus = await fetchMenus();
    data.menus = combineMenus(staticMenus, dynamicMenus);
    data.flags.menus = true;
  }
  return data.menus;
};

export const invalidateMenus = () => {
  data.flags.menus = false;
};

export const getModuleInfos = async () => {
  if (!data.flags.infos) {
    data.infos = await fetchModuleInfos();
    data.flags.infos = true;
  }
  return data.infos;
};

export const getModuleInfo = async (name) => {
  const infos = await getModuleInfos();
  return (infos || []).filter(info => info.name === name).pop();
};

export const invalidateInfos = () => {
  data.flags.infos = false;
};

export const getModuleLayout = async (name) => {
  if (!data.flags.layout) {
    data.layout = await fetchModuleLayout(name);
    data.flags.layout = true;
  }
  return data.layout;
};

export const invalidateLayout = () => {
  data.flags.layout = false;
};

// export const setModules = (modules) => {
//   data.init = true;
//   data.modules = modules;
// };
//
// export const getModules = () => {
//   return data.modules;
// };
//
// export const isInited = () => {
//   return data.init;
// };
//
// // noinspection EqualityComparisonWithCoercionJS
// export const getModule = id => data.modules.filter(m => m.id == id).pop(); // eslint-disable-line eqeqeq, max-len
//
// export const getPath = (id) => {
//   const module = getModule(id);
//   if (module.parent) {
//     const parent = getModule(module.parent);
//     return [...getPath(parent.id), id];
//   } else {
//     return [id];
//   }
// };
//
// export const getChildren = (id) => {
//   const children = [];
//   for (const module of data.modules) {
//     // noinspection EqualityComparisonWithCoercionJS
//     if (module.parent == id) { // eslint-disable-line eqeqeq
//       children.push(module);
//     }
//   }
//   return children;
// };
//
// export function foreachModule(callback) {
//   for (const module of data.modules) {
//     callback(module);
//   }
// }
//
// export const setModuleConfigure = (id, configure) => {
//   const module = getModule(id);
//   if (module) {
//     module.configure = configure;
//   }
// };
//
// export const getModuleConfigure = (id) => {
//   const module = getModule(id);
//   return module ? module.configure : null;
// };