import { countDeadOutbox } from '@/server/db/queries/outbox.js';
import { redactError } from '../redact.js';
import type { CheckAdapter, CheckResult } from '../types.js';

export const outboxAbandoned: CheckAdapter = {
  key: 'outbox_abandoned',
  title: 'Outbox abandoned (dead) events',
  defaultConfig: {},
  defaultIntervalHours: 1,
  defaultSeverityFloor: 'page',
  enabledByDefault: true,
  async run(ctx): Promise<CheckResult> {
    try {
      const deadCount = await countDeadOutbox(ctx.db);
      const severity = deadCount > 0 ? 'page' : 'info';
      return {
        key: this.key,
        severity,
        title: this.title,
        detail:
          deadCount > 0
            ? `${deadCount} outbox event(s) hit the retry cap and are dead — recoverable work is stalled. Re-drive from admin after fixing the cause.`
            : 'No abandoned outbox events.',
        metrics: { deadCount },
      };
    } catch (err) {
      return {
        key: this.key,
        severity: 'warn',
        degraded: true,
        title: this.title,
        detail: redactError(err, 'check threw'),
      };
    }
  },
};
