/**
 * A helper function that filters all the sections based on current users permissions
 * Checks each sections displayData for hideForUsers, showForUsers and hideForGuests
 * Returns an array of sections that the current logged in user has permissions for
 */

// Import helper functions from auth, to get current user, and check if guest
import { getCurrentUser, isLoggedInAsGuest } from '@/utils/Auth';

/* Helper function, checks if a given username appears in a user array */
const determineVisibility = (visibilityList, cUsername) => {
  let isFound = false;
  visibilityList.forEach((userInList) => {
    if (userInList.toLowerCase() === cUsername) isFound = true;
  });
  return isFound;
};

/* Returns false if this section should not be rendered for the current user/ guest */
const isSectionVisibleToUser = (displayData, currentUser, isGuest) => {
  // Checks if user explicitly has access to a certain section
  const checkVisiblity = () => {
    if (!currentUser) return true;
    const hideFor = displayData.hideForUsers || [];
    const cUsername = currentUser.user.toLowerCase();
    return !determineVisibility(hideFor, cUsername);
  };
  // Checks if user is explicitly prevented from viewing a certain section
  const checkHiddenability = () => {
    if (!currentUser) return true;
    const cUsername = currentUser.user.toLowerCase();
    const showForUsers = displayData.showForUsers || [];
    if (showForUsers.length < 1) return true;
    return determineVisibility(showForUsers, cUsername);
  };
  // Checks if the current user is a guest, and if section allows for guests
  const checkIfHideForGuest = () => {
    const hideForGuest = displayData.hideForGuests;
    return !(hideForGuest && isGuest);
  };
  return checkVisiblity() && checkHiddenability() && checkIfHideForGuest();
};

/* Putting it all together, the function to export */
const checkSectionVisibility = (sections) => {
  const currentUser = getCurrentUser(); // Get current user object
  const isGuest = isLoggedInAsGuest(); // Check if current user is a guest
  return sections.filter((currentSection) => {
    const displayData = currentSection.displayData || {};
    return isSectionVisibleToUser(displayData, currentUser, isGuest);
  });
};

export default checkSectionVisibility;
