/**
 * Реестр активных джоб планировщика (без импорта `scheduler.ts` → нет цикла с `run-once`).
 * Слот берётся до `await` в теле джобы — так `alert_engine` может дождаться REST и др. до чтения БД.
 */
const runningSchedulerJobs = new Set<string>()

const ALERT_SNAPSHOT_SOURCE_JOB_KEYS = new Set<string>([
  "traffic",
  "servers_rest_ping",
  "uptime_resources",
  "uptime_ping",
  "uptime_speed",
  "gre_bgp",
])

/** true, если слот занят (джоба уже выполняется). */
export function tryBeginSchedulerJob(jobKey: string): boolean {
  if (runningSchedulerJobs.has(jobKey)) return false
  runningSchedulerJobs.add(jobKey)
  return true
}

export function endSchedulerJob(jobKey: string): void {
  runningSchedulerJobs.delete(jobKey)
}

export function isSchedulerJobRunning(jobKey: string): boolean {
  return runningSchedulerJobs.has(jobKey)
}

/** Есть ли коллектор, который пишет таблицы снимка для `buildSignalSnapshot`. */
export function isAnyAlertSnapshotSourceJobRunning(): boolean {
  for (const k of ALERT_SNAPSHOT_SOURCE_JOB_KEYS) {
    if (runningSchedulerJobs.has(k)) return true
  }
  return false
}
