import { Job } from 'bullmq';
import type { Logger } from 'pino';
import type { TaskGroup } from './task-group.js';
import type { BulkJob, SingleOrArray, TaskOptions, TaskJobOptions, TaskTrigger, TaskTriggerEvent, TaskWorkerOptions, TaskJobData, TaskWorkerQueueListener } from './types/index.js';
import { TaskWorkerQueue } from './worker-queue.js';
import EventEmitter from 'node:events';
import { ToroTask } from './client.js';
import { TaskJob } from './job.js';
type InternalTaskTrigger<PayloadType> = TaskTrigger<PayloadType> & {
    internalId: number;
};
type InternalTaskTriggerEvent<PayloadType> = TaskTriggerEvent<PayloadType> & {
    internalId: number;
};
/**
 * Represents a defined task associated with a TaskGroup.
 * Extends EventEmitter to allow for event handling.
 * Implements the `process` method by calling the specific task `handler` or a registered subtask handler.
 * Can define and manage SubTasks.
 *
 * @template T The expected type of the data payload for this task's main handler.
 * @template R The expected return type of the job associated with this task's main handler.
 */
export declare abstract class BaseTask<PayloadType = any, ResultType = any, DataType extends TaskJobData<PayloadType> = TaskJobData<PayloadType>, TOptions extends TaskOptions = TaskOptions> extends EventEmitter {
    readonly group: TaskGroup;
    readonly id: string;
    options: TOptions;
    taskClient: ToroTask;
    jobsOptions: TaskJobOptions;
    workerOptions: Partial<TaskWorkerOptions> | undefined;
    queue: TaskWorkerQueue<PayloadType, ResultType>;
    logger: Logger;
    triggers: InternalTaskTrigger<PayloadType>[];
    protected currentEventTriggers: Map<number, InternalTaskTriggerEvent<PayloadType>>;
    constructor(group: TaskGroup, id: string, options: TOptions, triggers: SingleOrArray<TaskTrigger<PayloadType>> | undefined, parentLogger?: Logger);
    get queueName(): string;
    getWorkerOptions(): Partial<TaskWorkerOptions>;
    run(payload: PayloadType, overrideOptions?: TaskJobOptions): Promise<TaskJob<PayloadType, ResultType, string, TaskJobData<PayloadType>, import("./types/job.js").TaskJobState>>;
    runMany(jobs: Omit<BulkJob, 'data'>[], overrideOptions?: TaskJobOptions): Promise<TaskJob<PayloadType, ResultType, string, TaskJobData<PayloadType>, import("./types/job.js").TaskJobState>[]>;
    runAndWait(payload: PayloadType, overrideOptions?: TaskJobOptions, state?: TaskJobOptions['state']): Promise<ResultType>;
    protected getJobName(job: Job): string;
    protected getJobLogger(job: Job): Logger;
    process(job: TaskJob<PayloadType, ResultType, string>, token?: string): Promise<ResultType>;
    validate(job: TaskJob<PayloadType, ResultType, string>): Promise<PayloadType>;
    processJob(_job: TaskJob<PayloadType, ResultType, string>, _token?: string, _jobLogger?: Logger): Promise<ResultType>;
    validateJob(_job: TaskJob<PayloadType, ResultType, string>, _jobLogger?: Logger): Promise<PayloadType>;
    /**
     * Requests synchronization of all trigger types via the EventManager queue.
     */
    requestTriggerSync(): Promise<void>;
    /**
     * Synchronizes BullMQ Job Schedulers based on the task's triggers with cron/every.
     * This remains local to the Task instance.
     */
    protected _synchronizeCronEverySchedulers(): Promise<void>;
    /**
     * Collects desired event subscriptions and requests synchronization via the EventManager.
     */
    protected _requestEventTriggerSync(): Promise<void>;
    /**
     * Updates the task's default job options and triggers, then requests synchronization.
     */
    update(options?: TOptions, triggers?: SingleOrArray<TaskTrigger<PayloadType>>): Promise<void>;
    /**
     * Removes all BullMQ job schedulers (cron/every) and requests event trigger unregistration.
     */
    removeAllTriggers(): Promise<void>;
    /** Helper method to normalize trigger input and update internal state */
    protected _initializeTriggers(triggersInput?: SingleOrArray<TaskTrigger<PayloadType>>): void;
    emit<U extends keyof TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>>(event: U, ...args: Parameters<TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>[U]>): boolean;
    on<U extends keyof TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>>(event: U, listener: TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>[U]): this;
    off<U extends keyof TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>>(event: U, listener: TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>[U]): this;
    once<U extends keyof TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>>(event: U, listener: TaskWorkerQueueListener<PayloadType, ResultType, string, DataType>[U]): this;
    startWorker(options?: TaskWorkerOptions): Promise<import("./worker.js").TaskWorker<PayloadType, ResultType, string, TaskJob<PayloadType, ResultType, string, TaskJobData<PayloadType>, import("./types/job.js").TaskJobState>>>;
    stopWorker(): Promise<void>;
    close(): Promise<void>;
}
export {};
//# sourceMappingURL=base-task.d.ts.map