import { Collection, Db, ObjectId } from 'mongodb';
import type { JobParameters, JobId, JobsQueryOptions, JobsResult, JobsOverview, JobRepository, JobRepositoryOptions, RemoveJobsOptions } from 'agenda';
import type { MongoJobRepositoryConfig } from './types.js';
/**
 * Internal MongoDB document type with ObjectId for _id
 * This is what's actually stored in MongoDB, separate from the public JobParameters interface
 */
type MongoJobDocument = Omit<JobParameters, '_id'> & {
    _id?: ObjectId;
};
/**
 * @class
 * MongoDB implementation of JobRepository
 */
export declare class MongoJobRepository implements JobRepository {
    private connectOptions;
    collection: Collection<MongoJobDocument>;
    private mongoClient?;
    private _db?;
    private ownsConnection;
    constructor(connectOptions: MongoJobRepositoryConfig);
    private createConnection;
    getJobById(id: string): Promise<JobParameters | null>;
    /**
     * Convert a SortDirection value to MongoDB's numeric sort direction
     */
    private toMongoSortDirection;
    /**
     * Convert generic sort options to MongoDB sort
     */
    private toMongoSort;
    /**
     * Query jobs with database-agnostic options.
     * Handles state computation and filtering internally.
     */
    queryJobs(options?: JobsQueryOptions): Promise<JobsResult>;
    /**
     * Get overview statistics for jobs grouped by name.
     * Returns counts of jobs in each state for each job name.
     */
    getJobsOverview(): Promise<JobsOverview[]>;
    /**
     * Get all distinct job names
     */
    getDistinctJobNames(): Promise<string[]>;
    getQueueSize(): Promise<number>;
    removeJobs(options: RemoveJobsOptions): Promise<number>;
    /**
     * Build a MongoDB filter from RemoveJobsOptions
     */
    private buildFilterFromOptions;
    disableJobs(options: RemoveJobsOptions): Promise<number>;
    enableJobs(options: RemoveJobsOptions): Promise<number>;
    purgeAllJobs(): Promise<number>;
    unlockJob(job: JobParameters): Promise<void>;
    /**
     * Internal method to unlock jobs so that they can be re-run
     */
    unlockJobs(jobIds: (JobId | string)[]): Promise<void>;
    lockJob(job: JobParameters, options: JobRepositoryOptions | undefined): Promise<JobParameters | undefined>;
    getNextJobToRun(jobName: string, nextScanAt: Date, lockDeadline: Date, now: Date | undefined, options: JobRepositoryOptions | undefined): Promise<JobParameters | undefined>;
    /**
     * Get the underlying MongoDB Db instance (for use by job logger).
     */
    getDb(): Db;
    connect(): Promise<void>;
    private database;
    disconnect(): Promise<void>;
    saveJobState(job: JobParameters, options: JobRepositoryOptions | undefined): Promise<void>;
    /**
     * Save a job to the database (insert or update)
     * @param job Job parameters to save
     * @returns The saved job parameters with ID
     */
    saveJob<DATA = unknown>(job: JobParameters<DATA>, options: JobRepositoryOptions | undefined): Promise<JobParameters<DATA>>;
}
export {};
