import { Action } from '../action/Action';
import { Entity } from '../entity/Entity';
import { ViewEntity } from '../entity/ViewEntity';
import { Mutation } from '../mutation/Mutation';
import { Subscription } from '../subscription/Subscription';
import { Context } from '../..';
export interface PermissionMap {
    read?: Permission | Permission[];
    find?: Permission | Permission[];
    mutations?: {
        [key: string]: Permission | Permission[];
    };
    subscriptions?: Record<string, unknown> | Permission | Permission[];
}
export declare type PermissionMapGenerator = () => PermissionMap;
export declare class Permission {
    static EVERYONE: Permission;
    static AUTHENTICATED: Permission;
    isEmpty: boolean;
    everyoneCanAccess: boolean;
    authenticatedCanAccess: boolean;
    types: {};
    roles: any[];
    userAttributes: any[];
    lookups: any[];
    values: any[];
    states: any[];
    constructor();
    _checkCompatibility(type: any): void;
    everyone(): Permission;
    authenticated(): Permission;
    role(name: string): Permission;
    userAttribute(attributeName: string): Permission;
    lookup(entity: Entity | ViewEntity | (() => Entity) | (() => ViewEntity), lookupMap: Record<string, unknown>): Permission;
    value(attributeName: string, value: any): Permission;
    state(stateName: string): Permission;
    toString(): string;
}
export declare const isPermission: (obj: unknown) => obj is Permission;
export declare const isPermissionsArray: (obj: Permission | Permission[]) => obj is Permission[];
export declare const findInvalidPermissionAttributes: (permission: Permission, entity: Entity | ViewEntity) => void;
export declare const findMissingPermissionAttributes: (permission: Permission, permissionEntity: Entity | ViewEntity, mutation?: Mutation) => string | boolean;
export declare const findMissingPermissionStates: (permission: Permission, permissionEntity: Entity) => any;
export declare const validateActionLookupPermission: (permission: Permission, permissionAction: Action) => void;
export declare const generatePermissionDescription: (permissions: Permission | Permission[]) => string | boolean;
export declare const checkPermissionSimple: (permission: Permission, userId?: any, userRoles?: any[]) => boolean;
export declare const isPermissionSimple: (permission: unknown) => boolean;
export declare type UserAttributesPermissionFilter = {
    $or?: [{
        [attributeName: number]: string | number;
    }];
};
export declare const buildUserAttributesPermissionFilter: ({ permission, userId, }: {
    permission: Permission;
    userId: string | number;
}) => UserAttributesPermissionFilter | undefined;
export declare type StatesPermissionFilter = {
    $or?: [{
        state: {
            $in: string[] | number[];
        };
    }];
};
export declare const buildStatesPermissionFilter: ({ permission, entity, }: {
    permission: Permission;
    entity: Entity;
}) => StatesPermissionFilter | undefined;
export declare type ValuesPermissionFilter = {
    $or?: [{
        [attributeName: number]: any;
    }];
};
export declare const buildValuesPermissionFilter: ({ permission, }: {
    permission: Permission;
}) => ValuesPermissionFilter | undefined;
export declare type LookupsPermissionFilter = {
    $or?: [
        {
            $sub: {
                entity: string;
                condition: any[];
            };
        }
    ];
};
export declare const buildLookupsPermissionFilter: ({ permission, userId, userRoles, input, context, }: {
    permission: Permission;
    userId?: string | number;
    userRoles?: any;
    input?: any;
    context?: any;
}) => Promise<LookupsPermissionFilter | undefined>;
export declare type PermissionFilterSingle = {
    $and?: [
        UserAttributesPermissionFilter | StatesPermissionFilter | ValuesPermissionFilter | LookupsPermissionFilter
    ];
};
export declare const buildPermissionFilterSingle: (permission: Permission, userId?: string | number, userRoles?: any, entity?: Entity, input?: any, context?: any) => Promise<PermissionFilterSingle | undefined>;
export declare type PermissionFilter = {
    $or?: [PermissionFilterSingle];
};
export declare const buildPermissionFilter: (_permissions: Permission | Permission[], userId?: string | number, userRoles?: any, entity?: Entity, input?: any, context?: any) => Promise<PermissionFilter | undefined>;
export declare type ActionPermissionFilter = {
    $or?: [LookupsPermissionFilter];
};
export declare const buildActionPermissionFilter: (_permissions: () => Permission | Permission[], userId: any, userRoles: any[], action: Action | Subscription, input?: Record<string, unknown>, context?: Context) => Promise<{
    where: ActionPermissionFilter;
    lookupPermissionEntity: Entity;
}>;
export declare const checkPermissionAdvanced: (data: any, permission: Permission, userId?: any) => boolean;
export declare const hasEmptyPermissions: (_permissions: Permission | Permission[]) => boolean;
export declare const findEmptyEntityPermissions: (permissions: any) => string[];
export declare const processEntityPermissions: (entity: Entity, permissions: PermissionMap, defaultPermissions?: any) => PermissionMap;
export declare const processViewEntityPermissions: (entity: ViewEntity, permissions: PermissionMap, defaultPermissions?: any) => PermissionMap;
export declare const processActionPermissions: (action: Action, permissions: Permission | Permission[]) => Permission | Permission[];
