// [REQ D6]  Higher-Order Component – withRole(['admin'])(Component) opakowuje komponent w weryfikację roli
// [REQ D8]  HOC pattern – zwraca nowy komponent z dodaną logiką autoryzacji bez zmiany oryginału
// [REQ T7]  Render props i HOC – przykład HOC używanego w całej aplikacji do ochrony widoków
import { useAuth } from '../context/AuthContext';

/**
 * HOC — renders WrappedComponent only when the logged-in user has one of
 * the allowed roles. Renders `fallback` (default: null) otherwise.
 *
 * Usage:
 *   const AdminOnly = withRole(['admin'])(SomeComponent);
 */
const withRole = (allowedRoles, fallback = null) => (WrappedComponent) => {
  const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component';

  const WithRole = (props) => {
    const { user } = useAuth();
    if (!user || !allowedRoles.includes(user.role)) return fallback;
    return <WrappedComponent {...props} />;
  };

  WithRole.displayName = `withRole(${displayName})`;
  return WithRole;
};

export default withRole;
