type Dependency = 'database' | 'cache' | 'eventBroker';

type HealthStatus = 'OK' | 'FAILED';

interface EventBrokerHealthCheckerResult {
    status: HealthStatus;
    metadata: {
        consumersSet?: Set<string>;
    };
}

interface IHealthChecker<T = void> {
    dependency: Dependency;
    check(params?: DependencyHealthCheckerParams): Promise<T>;
}

interface IEventBrokerParams {
    queues?: string[];
    hostName?: string;
    consumersSet?: Set<string>;
    omitPing?: boolean;
    returnConsumersSet?: boolean;
}

type CheckerRegistry = {
    cache: IHealthChecker<void>;
    database: IHealthChecker<void>;
    eventBroker: IHealthChecker<EventBrokerHealthCheckerResult>;
};

type DependencyHealthDetail = {
    status: HealthStatus;
    durationMs?: number;
    metadata?: Record<string, unknown>;
};

type HealthCheckResult = {
    status: HealthStatus;
    details: Partial<Record<Dependency, DependencyHealthDetail>>;
};

type HealthCheckerParams = {
    eventBroker?: IEventBrokerParams;
    hostName?: string;
    skip?: string[];
    force?: boolean;
};

type DependencyHealthCheckerParams = {
    hostName?: string;
} & Partial<Record<Dependency, unknown>>;

declare class HealthCheckService {
    static check(dependencies: Dependency[], params?: HealthCheckerParams): Promise<HealthCheckResult>;
}

declare const PostgreSQLHealthChecker: IHealthChecker;

declare const RedisHealthChecker: IHealthChecker;

declare const RabbitMQHealthChecker: IHealthChecker<EventBrokerHealthCheckerResult>;

declare function registerHealthCheck(dependency: Dependency | Dependency[]): void;
declare function clearRegistry(): void;

declare const OK: HealthStatus;
declare const FAILED: HealthStatus;
declare const DEFAULT_HEALTH_STATUS: "OK";

export { RedisHealthChecker as CacheHealthChecker, type CheckerRegistry, DEFAULT_HEALTH_STATUS, PostgreSQLHealthChecker as DatabaseHealthChecker, type Dependency, type DependencyHealthCheckerParams, type DependencyHealthDetail, RabbitMQHealthChecker as EventBrokerHealthChecker, type EventBrokerHealthCheckerResult, FAILED, type HealthCheckResult, HealthCheckService, type HealthCheckerParams, type HealthStatus, type IEventBrokerParams, type IHealthChecker, OK, clearRegistry, registerHealthCheck };
