import type { DefaultElements, ISO8601Timestamp, Link, MakeRequest, MakeRequestPayload, VersionedLink } from '../common-types';
import type { AsyncActionProcessingOptions } from '../methods/action';
/** Entity types supported by the BulkAction API */
type Entity = 'Entry' | 'Asset';
type Collection<T> = Array<T>;
type EntityError = {
    entity: VersionedLink<Entity> | Link<Entity>;
    error: any;
};
export type BulkActionType = 'publish' | 'unpublish' | 'validate';
/** Represents the state of the BulkAction */
export declare enum BulkActionStatus {
    /** BulkAction is pending execution */
    created = "created",
    /** BulkAction has been started and pending completion */
    inProgress = "inProgress",
    /** BulkAction was completed successfully (terminal state) */
    succeeded = "succeeded",
    /** BulkAction failed to complete (terminal state) */
    failed = "failed"
}
declare const STATUSES: BulkActionStatus[];
type BulkActionStatuses = (typeof STATUSES)[number];
interface BulkActionFailedError {
    sys: {
        type: 'Error';
        id: 'BulkActionFailed';
    };
    message?: string;
    details?: {
        errors: Collection<EntityError>;
    };
}
export type BulkActionPayload = BulkActionPublishPayload | BulkActionUnpublishPayload | BulkActionValidatePayload;
export interface BulkActionValidatePayload extends MakeRequestPayload {
    action?: 'publish';
    entities: {
        sys?: {
            type: 'Array';
        };
        items: Collection<Link<Entity>>;
    };
}
export interface BulkActionUnpublishPayload extends MakeRequestPayload {
    entities: {
        sys?: {
            type: 'Array';
        };
        items: Collection<Link<Entity>>;
    };
}
export interface BulkActionPublishPayload extends MakeRequestPayload {
    entities: {
        sys?: {
            type: 'Array';
        };
        items: Collection<VersionedLink<Entity>>;
    };
}
interface AddFieldsEntity<L extends Link<Entity> | VersionedLink<Entity>> {
    entity: L;
    add?: {
        fields: Record<'*', string[]>;
    };
}
interface RemoveFieldsEntity<L extends Link<Entity> | VersionedLink<Entity>> {
    entity: L;
    remove?: {
        fields: Record<'*', string[]>;
    };
}
type BulkActionEntity<L extends Link<Entity> | VersionedLink<Entity>> = {
    entity: L;
};
export interface PublishBulkActionV2Payload<PublishActionType extends 'add' | 'remove' = 'add'> {
    action: 'publish';
    entities: PublishActionType extends 'remove' ? RemoveFieldsEntity<VersionedLink<Entity>>[] : AddFieldsEntity<VersionedLink<Entity>>[];
}
export interface ValidateBulkActionV2Payload<PublishActionType extends 'add' | 'remove' = 'add'> {
    action: 'validate';
    entities: PublishActionType extends 'remove' ? RemoveFieldsEntity<Link<Entity>>[] : AddFieldsEntity<Link<Entity>>[];
}
export interface UnpublishBulkActionV2Payload {
    action: 'unpublish';
    entities: BulkActionEntity<Link<Entity>>[];
}
export type BulkActionV2Payload = PublishBulkActionV2Payload<'add'> | PublishBulkActionV2Payload<'remove'> | UnpublishBulkActionV2Payload | ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'>;
export type BulkActionSysProps = {
    id: string;
    type: 'BulkAction';
    status: BulkActionStatuses;
    space: Link<'Space'>;
    environment: Link<'Environment'>;
    createdBy: Link<'User'>;
    createdAt: ISO8601Timestamp;
    updatedAt: ISO8601Timestamp;
};
/** The object returned by the BulkActions API */
export interface BulkActionProps<TPayload extends BulkActionPayload | BulkActionV2Payload = any> {
    sys: BulkActionSysProps;
    action: BulkActionType;
    /** original payload when BulkAction was created */
    payload: TPayload;
    /** error information, if present */
    error?: BulkActionFailedError;
}
export interface BulkActionApiMethods {
    /** Performs a new GET request and returns the wrapper BulkAction */
    get(): BulkAction;
    /** Waits until the BulkAction is in one of the final states (`succeeded` or `failed`) and returns it. */
    waitProcessing(options?: AsyncActionProcessingOptions): Promise<BulkAction>;
}
export interface BulkAction<T extends BulkActionPayload | BulkActionV2Payload = any> extends BulkActionProps<T>, BulkActionApiMethods, DefaultElements<BulkActionProps<T>> {
}
/**
 * @internal
 * @param makeRequest - function to make requests via an adapter
 * @param data - Raw BulkAction data
 * @returns Wrapped BulkAction data
 */
export declare function wrapBulkAction<TPayload extends BulkActionPayload | BulkActionV2Payload = any>(makeRequest: MakeRequest, data: BulkActionProps<BulkActionPayload | BulkActionV2Payload>): BulkAction<TPayload>;
export {};
