import Mock from 'mockjs';

const Random = Mock.Random;

const padDigits = (number, digits) => {
  return new Array(Math.max(digits - String(number).length + 1, 0)).join('0') + number;
};

let baseId = 10000;
let groupIdx = 1;
let moduleIdx = 1;
const groupPool = [];

const groupIdGenerator = () => {
  const id = baseId++;
  groupPool.push({
    id,
    children: [],
  });
  return id;
};

const groupNameGenerator = () => `模块组${padDigits(groupIdx++, 2)}`;

const moduleIdGenerator = () => baseId++;

const moduleNameGenerator = () => `模块${padDigits(moduleIdx++, 2)}`;

// eslint-disable-next-line func-names
const parentPicker = isRoot => function () {
  if (!isRoot) {
    const parent = Random.pick(groupPool);
    parent.children.push(this.id);
    return Number.parseInt(parent.id, 10);
  } else {
    return null;
  }
};

const moduleCreator = () => {
  const leafGroupPool = groupPool.filter(group => group.children.length === 0);
  const modules0 = Mock.mock({
    [`modules|${leafGroupPool.length}-${leafGroupPool.length}`]: [{
      id: moduleIdGenerator,
      name: moduleNameGenerator,
      'parent|+1': leafGroupPool.map(group => group.id),
    }],
  }).modules;
  const modules1 = Mock.mock({
    [`modules|0-${3 * groupPool.length}`]: [{
      id: moduleIdGenerator,
      name: moduleNameGenerator,
      'parent|1': groupPool.map(group => group.id),
    }],
  }).modules;
  return [
    ...modules0,
    ...modules1,
  ];
};

const defaultGroups = [{
  id: 1,
  name: '业务流程',
  parent: null,
  group: true,
}, {
  id: 2,
  name: '业务流程1',
  parent: 1,
  group: true,
}];

const defaultModules = [{
  id: 1000,
  name: '当前任务',
  parent: 1,
  route: 'task',
}, {
  id: 1001,
  name: '当前任务1',
  parent: 2,
  route: 'task',
}];

export function genModules() {
  const mock = Mock.mock({
    'groups|3-5': [{
      name: groupNameGenerator,
      parent: parentPicker(true),
      id: groupIdGenerator,
      group: true,
    }],
    'subGroups|0-15': [{
      name: groupNameGenerator,
      parent: parentPicker(false),
      id: groupIdGenerator,
      group: true,
    }],
    modules: moduleCreator,
  });
  const mNum = mock.modules.length;
  return {
    all: [
      ...defaultGroups,
      ...mock.groups,
      ...mock.subGroups,
      ...mock.modules,
      ...defaultModules,
    ],
    public: [...defaultModules, ...Random.pick(mock.modules, (mNum / 3) | 0, (2 * mNum / 3) | 0)],
  };
}