import { useSelector } from "react-redux";
import { RootState } from "../store";
import {
  hasPermission,
  canView,
  canManage,
  canPerformAction,
  hasAnyPermission,
  hasAllPermissions,
  getModulePermissions,
} from "../utils/permissions";

/**
 * Enhanced permissions hook that provides multiple ways to check permissions
 */
export const usePermissions = (
  groupKeyOrModule: string,
  permissionKeyOrAction?: string
) => {
  const permissions = useSelector((state: RootState) => state.auth.permissions);

  // If only one parameter is provided, treat it as a module and return module permissions
  if (!permissionKeyOrAction) {
    return getModulePermissions(permissions, groupKeyOrModule);
  }

  // If permission key starts with 'view_' or 'manage_', use direct permission check
  if (
    permissionKeyOrAction.startsWith("view_") ||
    permissionKeyOrAction.startsWith("manage_")
  ) {
    return hasPermission(permissions, permissionKeyOrAction);
  }

  // If action is 'view' or 'manage', use the utility functions
  if (permissionKeyOrAction === "view") {
    return canView(permissions, groupKeyOrModule);
  }

  if (permissionKeyOrAction === "manage") {
    return canManage(permissions, groupKeyOrModule);
  }

  // For other actions, use canPerformAction
  return canPerformAction(permissions, permissionKeyOrAction, groupKeyOrModule);
};

/**
 * Simple hook for checking a specific permission key
 */
export const useHasPermission = (permissionKey: string): boolean => {
  const permissions = useSelector((state: RootState) => state.auth.permissions);
  return hasPermission(permissions, permissionKey);
};

/**
 * Hook for checking multiple permissions (OR logic)
 */
export const useHasAnyPermission = (permissionKeys: string[]): boolean => {
  const permissions = useSelector((state: RootState) => state.auth.permissions);
  return hasAnyPermission(permissions, permissionKeys);
};

/**
 * Hook for checking multiple permissions (AND logic)
 */
export const useHasAllPermissions = (permissionKeys: string[]): boolean => {
  const permissions = useSelector((state: RootState) => state.auth.permissions);
  return hasAllPermissions(permissions, permissionKeys);
};

/**
 * Hook for getting all permission levels for a module
 */
export const useModulePermissions = (module: string) => {
  const permissions = useSelector((state: RootState) => state.auth.permissions);

  return getModulePermissions(permissions, module);
};

export default usePermissions;
