import type { PressZoneBindings } from './config.js'

export interface ExecutionContextLike {
  waitUntil(promise: Promise<unknown>): void
}

export interface ScheduledEventLike {
  cron: string
  scheduledTime: number
}

export type QueueJob =
  | {
      type: 'period-rollover-housekeeping'
      triggeredBy: string
      scheduledAt: string
    }
  | {
      type: 'reconcile-charge-intents'
      triggeredBy: string
      scheduledAt: string
    }

export async function runCron(
  event: ScheduledEventLike,
  env: PressZoneBindings,
  context: ExecutionContextLike,
): Promise<void> {
  const queue = env.JOBS_QUEUE

  if (!queue) {
    return
  }

  const scheduledAt = new Date(event.scheduledTime).toISOString()
  const jobs: QueueJob[] = [
    {
      type: 'period-rollover-housekeeping',
      triggeredBy: event.cron,
      scheduledAt,
    },
    {
      type: 'reconcile-charge-intents',
      triggeredBy: event.cron,
      scheduledAt,
    },
  ]

  context.waitUntil(Promise.all(jobs.map((job) => queue.send(job))))
}
