import { AuthorizedBtnProps, AuthList, GetAuthorizedPageProps } from "."
import { IRoute } from 'umi';

declare const ANTD_AUTH_CONF: {
  auth_menu: 'authMenu',
  auth_btn: 'authBtn',
  auth_check_url: 'menuUrl',
  [k: string]: unknown
}

/**
 * @description: 按钮权限
 * @param { string } path 路径
 * @param { React.ReactNode } children 展示内容
 */
export const FormatBtn = ({ path, children }: AuthorizedBtnProps) => {
  if (!path) {
    return children || null;
  }
  if (!!ANTD_AUTH_CONF) {
    const authBtns: AuthList =
      (sessionStorage.getItem(ANTD_AUTH_CONF.auth_btn) && JSON.parse(sessionStorage.getItem(ANTD_AUTH_CONF.auth_btn) || "[]")) || [];
    let finx = -1;
    if (ANTD_AUTH_CONF.auth_check_url) {
      finx = (authBtns as Record<string, unknown>[]).findIndex((item) => item[ANTD_AUTH_CONF.auth_check_url] === path,
      );
    } else {
      finx = authBtns.findIndex((item) => item === path);
    }
    if (finx === -1) {
      return null;
    }
  }
  return children || null;
};
/**
 * @description: 根据 menuUrl 判断是否存在权限
 * @param {string} path 路径
 * @param {Array} authMenus 权限路由
 * @return {*}
 */
const checkRouter = (path: string, authMenus: AuthList) => {
  let fig = true;
  let finx = -1;
  if (ANTD_AUTH_CONF.auth_check_url) {
    finx = (authMenus as Record<string, unknown>[]).findIndex(
      (item) => item[ANTD_AUTH_CONF.auth_check_url] === path,
    );
  } else {
    finx = authMenus.findIndex((item) => item === path);
  }
  if (finx === -1) {
    fig = false;
  }
  if (
    path === '/404' ||
    path === '/403' ||
    path === '/' ||
    path === '/welcome'
  ) {
    fig = true;
  }
  return fig;
};
/**
 * @description: 页面权限
 * authMenus 权限路由
 * @param {Array} allRouters 原始 routes.json 文件中路由
 * @param {string} pathname 当前路径
 * @return {*}
 */
export const getFormatPage: GetAuthorizedPageProps = (allRouters, pathname) => {
  // 1. 有权限 无页面 404
  // 2. 有权限 有页面 403
  // 3. 无权限 有页面 403
  // 4. 无权限 无页面 404
  // 5. 其他
  if (!!ANTD_AUTH_CONF) {
    const allMenu = !!sessionStorage.getItem(ANTD_AUTH_CONF.auth_menu)
      ? JSON.parse(sessionStorage.getItem(ANTD_AUTH_CONF.auth_menu) || "[]")
      : [];
    const check =
      mapRouterCheck(allRouters, pathname).length > 0 ? true : false;
    // 若不在权限路由中则提示无权限
    const authCheck = checkRouter(pathname, allMenu);
    if (check && !authCheck) {
      // 无权访问
      return 403;
    } else if (check && authCheck) {
      // 其他
      return true;
    } else {
      // 找不到
      return 404;
    }
  }
  return true;
};
/**
 * @param { Array } data 路由
 * @param { string } pathName 路径
 * @param { Array<true|flase> } list  [ true | flase ]
 * @return {*}
 */
const mapRouterCheck = (data: IRoute[], pathName: string, list: IRoute[] = []) => {
  (data || []).forEach((val) => {
    const { path, routes } = val;
    if (
      path == pathName ||
      path === '/404' ||
      path === '/403' ||
      path === '/' ||
      path === '/welcome'
    ) {
      list.push(val);
    } else if (routes) {
      mapRouterCheck(routes, pathName, list);
    }
  });
  return list;
};