import { Request } from 'express';
import { Document, Model } from 'mongoose';
import { IPermission } from '../models/permissionSchema';
import { IRole } from '../models/roleSchema';
import { IUser } from '../models/userSchema';
declare type RequiredAttrsPath = {
    name: string;
    required: boolean;
};
export declare type ObjectPath = RequiredAttrsPath & {
    complex: true;
    name: string;
    type: 'Object';
    children: Path[];
};
declare type ArrayPath = RequiredAttrsPath & {
    complex: true;
    type: 'Array';
    label: string;
    children: Path[];
};
declare type FieldPath = RequiredAttrsPath & {
    type: 'Number' | 'String' | 'Boolean' | 'ObjectId';
};
export declare type Path = FieldPath | ObjectPath | ArrayPath;
export declare type UserRequest = Request & {
    user: IUser;
};
export declare type EditRequest<T extends Document> = UserRequest & {
    doc: T;
};
export declare type EditPermRequest<T extends Document> = EditRequest<T> & {
    doc_perm: IPermission;
};
export declare type RolePermRequest = UserRequest & {
    role: IRole;
};
export declare type PermissionRequest<T extends Document> = EditRequest<T> & {
    perm: IPermission;
    permission: PermissionEnum;
    role: PermissionEnum;
};
declare type RequestFilterQuery = (req: UserRequest, callback: (error: Error | null, query: {
    [key: string]: any;
}) => void) => void;
declare type EditPermision = (req: UserRequest, doc: Document, callback: HasPermissionCallback) => void;
declare type AddPermision = (req: UserRequest, callback: HasPermissionCallback) => void;
declare type GlobalPermision = (req: UserRequest, callback: (error: Error | null, permission: PermissionEnum) => void) => void;
declare type GetMaxPermission = {
    getMaxPermission: GlobalPermision;
};
declare type PermissionCallbacks = {
    getFilterByPermissions?: RequestFilterQuery;
    hasAdminPermission: EditPermision;
    hasEditPermission: EditPermision;
    hasAddPermission: AddPermision;
    hasUpdatePermission: EditPermision;
    hasDeletePermission: EditPermision;
};
export declare type PermissionChecks = PermissionCallbacks & GetMaxPermission;
export declare type ServeOptions = {
    MAX_RESULTS?: number;
    name?: string;
} & Partial<PermissionCallbacks>;
export declare type HasPermissionCallback = (error: Error | null, hasPermission: boolean, reason?: string) => void;
export declare type InfoModel = {
    name: string;
    label: string;
    route: string;
    paths: Path[];
    model: Model<any>;
};
export declare enum PermissionEnum {
    ADMIN = 5,
    DELETE = 4,
    UPDATE = 3,
    READ = 2,
    ADD = 1
}
declare const PERMISSION_MODEL = "Permission";
declare const ROLE_MODEL = "Role";
export { PERMISSION_MODEL, ROLE_MODEL };
export declare type FullPathTypes = {
    type: string;
} | {
    type: 'Ref' | 'ArrayRef';
    to: string;
} | {};
