/* eslint-disable */
const path = require('path');
const fs = require('fs');
const json2xls = require('json2xls');
const menuData = require('./menu-data.js');
const buttonData = require('./button-code.js');

function checkMenuData(data, level) {
  return data.some(el => {
    // 每个节点是否有menu属性
    let flag = el.hasOwnProperty('menu');
    if (!flag) {
      console.log(el, '没有menu属性');
      return !flag;
    }
    // 每个menu是否有三个元素
    flag = Array.isArray(el.menu) && ((level == 1 && el.menu.length == 4) || el.menu.length == 3);
    if (!flag) {
      console.log(el, 'menu格式错误');
      return !flag;
    }
    // 第一、二级菜单没有url
    if (level == 0 || level == 1) {
      flag = !el.menu[1];
      if (!flag) {
        console.log(el, '配置了menuUrl');
        return !flag;
      }
    } else {
      // 一、二级之后的菜单必须有url
      flag = !!el.menu[1];
      if (!flag) {
        console.log(el, '未配置menuUrl');
        return !flag;
      }
      flag = el.menu[1].indexOf('/') != 0;
      if (!flag) {
        console.log(el, 'menuUrl不能以/开头');
        return !flag;
      }
    }
    if (flag && Array.isArray(el.children)) {
      flag = !checkMenuData(el.children, level + 1);
    }
    return !flag;
  });
};
function createMenuJson(data, parentCode) {
  let result = [];
  data.forEach((el, index) => {
    // 菜单名称、路径、是否受权限控制、icon_url
    const [ menuName, menuUrl, isRight, iconUrl ] = el.menu;
    const menuIndex = (index + 1).toString().padStart(2, '0');
    const item = {
      menuName,
      menuCode: parentCode ? parentCode  + menuIndex : 'hb_m' + menuIndex,
      parentCode: parentCode || '0',
      menuUrl,
      menuType: 0,
      iconUrl,
      isRight
    }
    result.push(item);
    if (Array.isArray(el.children)) {
      result = result.concat(createMenuJson(el.children, item.menuCode));
    }
  });
  return result;
}
function checkButtonData(data, menuJson) {
  function hasPage(menuUrl, menuJson, menuUrlList) {
    const menu = menuJson.find(el => el.menuUrl == menuUrl) || {};
    let flag = menu && menu.menuCode;
    if (!Array.isArray(menuUrlList)) {
      menuUrlList = [];
    }
    menuUrlList.push(menuUrl)
    if (!flag) {
      console.log(menuUrlList, '页面不存在');
      return flag;
    }
    if (menu.parentCode.length > 6) {
      flag = hasPage(menuJson.find(el => el.menuCode == menu.parentCode).menuUrl, menuJson, menuUrlList);
    }
    return flag;
  }
  
  let buttonCode = [];
  let flag = Object.keys(data).some(menuUrl => {
    // 按钮所在的页面和上级页是否存在
    return !hasPage(menuUrl, menuJson) || Object.keys(data[menuUrl]).some(code => {
      // 按钮code是否重复
      let flag = buttonCode.includes(code);
      if (flag) {
        console.log(code, 'code重复了');
        return flag;
      }
      // 按钮名称、是否受权限控制、是否增删改、跳转页面
      // 是否有3个或者4个元素
      flag = !Array.isArray(data[menuUrl][code]) || (data[menuUrl][code].length != 3 && data[menuUrl][code].length != 4);
      if (flag) {
        console.log(code, '按钮数据配置错误');
        return flag;
      }
      // 如果是跳转按钮
      if (data[menuUrl][code][2] == 0) {
        // 是否配了跳转页面
        flag = !data[menuUrl][code][3];
        if (flag) {
          console.log(code, '未配置跳转页面')
          return;
        }
        // 按钮跳转的页面和上级页面是否存在
        flag = !hasPage(data[menuUrl][code][3], menuJson);
        if (flag) {
          console.log(code, '页面不存在');
          return flag;
        }
      }

      return false;
    });
  });
  return flag;
}
function createButtonJson(data, menuJson) {
  return Object.keys(data).reduce((buttonJson, menuUrl) => {
    const codeData = data[menuUrl];
    const menuCode = menuJson.find(el => el.menuUrl == menuUrl).menuCode;
    const codeJson = Object.keys(codeData).reduce((result, btnCode) => {
      // 按钮名称、是否受权限控制、是否增删改、跳转页面
      const [ menuName, isRight, buttonType, toUrl ] = codeData[btnCode];
      const item = {
        menuName,
        menuCode: btnCode,
        parentCode: menuCode,
        menuType: 5,
        isRight,
        buttonType: buttonType == 1 ? 1 : 0,
        toUrl
      };
      result.push(item);
      return result;
    }, []);
    return buttonJson.concat(codeJson);
  }, [])
}
function createXls() {
  if (checkMenuData(menuData, 0)) return;
  const menuJson = createMenuJson(menuData, '');
  if (checkButtonData(buttonData, menuJson)) return;
  const buttonJson = createButtonJson(buttonData, menuJson);
  // 按钮受权限控制时，跳转页面不受权限控制，并且跳转页面的关联code改成按钮code
  // 按钮不受权限控制时，跳转页面受权限控制，并且按钮的关联code改成页面的code
  buttonJson.forEach(btn => {
    if (btn.buttonType == 0) {
      menuJson.some(menu => {
        if (menu.menuUrl == btn.toUrl) {
          if (btn.isRight == 1) {
            menu.isRight = 0;
            menu.concatCode = btn.menuCode;
          } else {
            menu.isRight = 1;
            btn.concatCode = menu.menuCode;
          }
        }
        return menu.menuUrl == btn.toUrl;
      })
    }
  })
  let rightErr = false;
  menuJson.forEach(el => {
    if (el.isRight == 0) {
      const result = []
      menuJson.forEach(item => {
        if (item.parentCode == el.menuCode && item.isRight == 1) {
          result.push(item);
        }
      })
      if (result.length > 0) {
        rightErr = true;
        console.log(result, '不受权限控制的页面下不可以挂受权限控制的子页面')
      }
    }
  })
  if (rightErr) return;
  const jsonArray = [...menuJson, ...buttonJson].map( item => {
    return {
      '菜单名称': item.menuName,
      '菜单code': item.menuCode,
      '父菜单code': item.parentCode,
      '菜单路径': item.menuUrl || '',
      '菜单类型(0菜单 5按钮)': item.menuType,
      'icon_url': item.iconUrl || '',
      '是否控制权限，1控制  0否': item.isRight,
      '只有页面才有,用于菜单不需要独立权限控制,配置的是按钮的menu_code': item.concatCode || '',
      '是否赠删改的按钮0：跳转 1：增删改 2：其他': typeof item.buttonType == 'number' ? item.buttonType : ''
    }
  });
  fs.writeFile(path.resolve(__dirname, './result.xlsx'), json2xls(jsonArray), 'binary', (err) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log('写入完成');
  });
}
function createButtonCodeJson(buttonData) {
  let result = {};
  Object.keys(buttonData).forEach(k => {
    Object.keys(buttonData[k]).forEach(code => {
      result[code] = code;
    })
  })
  fs.writeFile(path.resolve(__dirname, './button-code.json'), JSON.stringify(result), (err) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log('写入完成');
  })
}
// createXls();

createButtonCodeJson(buttonData)
