import { jsx as _jsx } from "react/jsx-runtime";
import { CURRENT } from "./renderAuthorize"; // eslint-disable-next-line import/no-cycle

import PromiseRender from "./PromiseRender";
/**
 * 通用权限检查方法
 * Common check permissions method
 * @param { 权限判定 | Permission judgment } authority
 * @param { 你的权限 | Your permission description } currentAuthority
 * @param { 通过的组件 | Passing components } target
 * @param { 未通过的组件 | no pass components } Exception
 */

var checkPermissions = function checkPermissions(authority, currentAuthority, target, Exception) {
  // 没有判定权限.默认查看所有
  // Retirement authority, return target;
  if (!authority) {
    return target;
  } // 数组处理


  if (Array.isArray(authority)) {
    if (Array.isArray(currentAuthority)) {
      if (currentAuthority.some(function (item) {
        return authority.includes(item);
      })) {
        return target;
      }
    } else if (authority.includes(currentAuthority)) {
      return target;
    }

    return Exception;
  } // string 处理


  if (typeof authority === 'string') {
    if (Array.isArray(currentAuthority)) {
      if (currentAuthority.some(function (item) {
        return authority === item;
      })) {
        return target;
      }
    } else if (authority === currentAuthority) {
      return target;
    }

    return Exception;
  } // Promise 处理


  if (authority instanceof Promise) {
    return _jsx(PromiseRender, {
      ok: target,
      error: Exception,
      promise: authority
    }, void 0);
  } // Function 处理


  if (typeof authority === 'function') {
    var bool = authority(currentAuthority); // 函数执行后返回值是 Promise

    if (bool instanceof Promise) {
      return _jsx(PromiseRender, {
        ok: target,
        error: Exception,
        promise: bool
      }, void 0);
    }

    if (bool) {
      return target;
    }

    return Exception;
  }

  throw new Error('unsupported parameters');
};

export { checkPermissions };

function check(authority, target, Exception, allowCheck) {
  if (allowCheck === void 0) {
    allowCheck = true;
  } // 如果不允许检查，则直接返回noMatch


  if (!allowCheck) {
    return Exception;
  }

  return checkPermissions(authority, CURRENT, target, Exception);
}

export default check;

