import Joi from 'joi';
import { type AnyRecord, type AnyValue, type Attachable, type FilledCallback, type Model, type OpenApiSchema, type Optional, type PivotFieldCallback, type PrimaryKey, type RelatableQueryCallback, type Rules, type SanitizeCallback } from '../Contracts';
import type AvonRequest from '../Http/Requests/AvonRequest';
import type Resource from '../Resource';
import Relation from './Relation';
export default class BelongsToMany extends Relation {
    /**
     * The pivot resource instance
     */
    pivotResource: Resource;
    /**
     * The foreign key of the related model.
     * The attribute name that holds the parent model key.
     */
    protected resourceForeignKey?: string;
    /**
     * The associated key on the related model.
     * Defaults to primary key of related model.
     */
    protected resourceOwnerKey?: string;
    /**
     * Indicates fields uses to update pivot table.
     */
    protected pivotFields: PivotFieldCallback;
    /**
     * The callback that should be run to pivots table.
     */
    pivotQueryCallback: RelatableQueryCallback;
    /**
     * The callback that should be run to sanitize related resources.
     */
    sanitizeCallback: SanitizeCallback;
    constructor(resource: string, pivot: string, attribute?: string);
    /**
     * Determine the pivot resource query.
     */
    pivotQueryUsing(pivotQueryCallback: RelatableQueryCallback): this;
    /**
     * Get the pivot resource.
     */
    protected getPivotResource(resourceName: string): Resource<Model>;
    /**
     * Determine pivot fields.
     */
    pivots(callback: PivotFieldCallback): this;
    /**
     * Get the validation rules for this field.
     */
    getRules(request: AvonRequest): Rules;
    /**
     * Get Joi rule to validate resource existence.
     */
    protected existenceRule(request: AvonRequest): Joi.ExternalValidationFunction;
    /**
     * Set related model foreign key.
     */
    setResourceForeignKey(resourceForeignKey: string): this;
    /**
     * Get attribute that hold the related model key.
     */
    resourceForeignKeyName(request: AvonRequest): string;
    /**
     * Set the related model owner key.
     */
    setResourceOwnerKey(resourceOwnerKey: string): this;
    /**
     * Get attribute that hold the related model key.
     */
    resourceOwnerKeyName(request: AvonRequest): string;
    /**
     * Hydrate the given attribute on the model based on the incoming request.
     */
    fillForAction<TModel extends Model>(request: AvonRequest, model: TModel): AnyValue;
    /**
     * Hydrate the given attribute on the model based on the incoming request.
     */
    protected fillAttributeFromRequest(request: AvonRequest, requestAttribute: string): Optional<FilledCallback>;
    /**
     * Detach all related models.
     */
    protected clearAttachments(request: AvonRequest, resource: Model): Promise<AnyValue>;
    protected allowedDetachments(request: AvonRequest, model: Model): Promise<Model[]>;
    prepareAttachments(request: AvonRequest, resource: Model, requestAttribute: string): Promise<Model[]>;
    protected getAttachments(request: AvonRequest, requestAttribute: string): Attachable[];
    /**
     * Filter attachments by policy.
     */
    protected filterAllowedAttachments(request: AvonRequest, model: Model, attachments: Attachable[]): Promise<Attachable[]>;
    protected getRelatedResources(request: AvonRequest, resourceIds: Array<PrimaryKey>): Promise<Model[]>;
    sanitizeUsing(sanitizeCallback: SanitizeCallback): this;
    /**
     * Fill pivot models.
     */
    fillPivotFromRequest(request: AvonRequest, requestAttribute: string, attachments: Attachable[]): Model[];
    /**
     * Resolve related value for given resources.
     */
    resolveRelatables(request: AvonRequest, resources: Model[]): Promise<AnyValue>;
    /**
     * Get related models for given resources.
     */
    searchRelatables(request: AvonRequest, resources: Model[]): Promise<Model[]>;
    /**
     * Get pivot records for given resources.
     */
    protected getPivotModels(request: AvonRequest, resources: Model[]): Promise<Model[]>;
    /**
     * Get pivot records for given resources.
     */
    protected getRelatedModels(request: AvonRequest, pivots: Model[]): Promise<Model[]>;
    /**
     * Format the given related resource.
     */
    formatRelatedResource(request: AvonRequest, resource: Model & {
        pivot?: Model;
    }): AnyRecord;
    /**
     * Get the swagger-ui schema.
     */
    protected responseSchema(request: AvonRequest): OpenApiSchema;
    /**
     * Get the swagger-ui schema.
     */
    protected payloadSchema(request: AvonRequest): OpenApiSchema;
    /**
     * Get the pivot fields swagger-ui schema.
     */
    protected pivotSchema(request: AvonRequest): Record<string, OpenApiSchema>;
    /**
     * Get the value considered as null.
     */
    nullValue(): AnyValue;
    /**
     * Determine field is filterable or not.
     */
    isFilterable(): boolean;
}
