import { usePage } from '@inertiajs/react';
import { useCallback, useMemo } from 'react';
import type { Permission, RbacPageProps, UserRole } from '../types/auth';

export const usePermissions = () => {
    const { auth } = usePage<RbacPageProps>().props;
    const permissions = useMemo(
        () => new Set<Permission>(auth?.permissions ?? []),
        [auth?.permissions],
    );

    const can = useCallback(
        (permission: Permission | Permission[]): boolean => {
            const required = Array.isArray(permission) ? permission : [permission];
            return required.some((item) => permissions.has(item));
        },
        [permissions],
    );

    const canAll = useCallback(
        (required: Permission[]): boolean => required.every((item) => permissions.has(item)),
        [permissions],
    );

    const hasRole = useCallback(
        (role: UserRole | UserRole[]): boolean => {
            const roles = Array.isArray(role) ? role : [role];
            return roles.some((item) => auth?.roles?.includes(item));
        },
        [auth?.roles],
    );

    return { can, canAll, hasRole, user: auth?.user ?? null };
};
