/**
 * Print-spool maintenance (server/utils/printSpoolDb.ts):
 *  - every 60 s: 'sent' jobs without an agent ack for 3 min go back to 'queued' (the agent's
 *    idempotent job ledger makes a resend safe — covers an agent that died mid-batch);
 *  - every 10 min: final jobs older than 24 h are deleted from the spool table. The staged PDFs
 *    stay where the print routes always put them (<printStorageDir>/<pathName>), as before.
 * Only PM2 instance 0 runs it (NODE_APP_INSTANCE), mirroring ticket-auto-close.ts.
 */
import { requeueStaleSentJobs, purgeOldJobs, finalizeStaleSpooledJobs, purgeRelayCommands } from '../utils/printSpoolDb'

export default defineNitroPlugin(() => {
  if (import.meta.prerender) return
  const inst = process.env.NODE_APP_INSTANCE
  if (inst !== undefined && inst !== '0') return

  const requeue = () => {
    try {
      const n = requeueStaleSentJobs(3)
      if (n) console.log(`[print-spool] re-queued ${n} stale job(s) without agent ack`)
      purgeRelayCommands()
    } catch (e: any) { console.error('[print-spool] requeue failed:', e?.message || e) }
  }
  const purge = () => {
    try {
      const f = finalizeStaleSpooledJobs(30)
      if (f) console.log(`[print-spool] closed ${f} spooled job(s) without completion report (> 30 min) as completed`)
      const r = purgeOldJobs(24)
      if (r.rows) console.log(`[print-spool] purged ${r.rows} finished job row(s) older than 24 h`)
    } catch (e: any) { console.error('[print-spool] purge failed:', e?.message || e) }
  }
  setInterval(requeue, 60_000).unref()
  setTimeout(purge, 120_000).unref()
  setInterval(purge, 10 * 60_000).unref()
})
