import type { CanActivateFn } from './Routes';

import { isNull, isObject } from 'lodash';
import { Navigate, useLocation } from 'react-router-dom';

import { useACL } from '@react-devui/hooks';

import { LOGIN_PATH, PREV_ROUTE_KEY } from './config/other';
import { TOKEN } from './core';

export function useACLGuard(): CanActivateFn {
  const acl = useACL();
  return (route) => {
    if (route.data && route.data.acl) {
      const params =
        isObject(route.data.acl) && 'control' in route.data.acl
          ? route.data.acl
          : {
              control: route.data.acl,
            };
      if (!acl.can(params.control, params.mode)) {
        return <Navigate to="/exception/403" replace />;
      }
    }

    return true;
  };
}

export function useTokenGuard(): CanActivateFn {
  const location = useLocation();

  return () => {
    const token = TOKEN.value;
    if (isNull(token)) {
      return <Navigate to={LOGIN_PATH} state={{ [PREV_ROUTE_KEY]: location }} replace />;
    }

    if (TOKEN.expired) {
      return <Navigate to={LOGIN_PATH} state={{ [PREV_ROUTE_KEY]: location }} replace />;
    }

    return true;
  };
}