import { createDbService } from '@/server/services/db.js';
import { listDlqEvents } from '@/server/db/queries/dlq-events.js';
import type { AlertSeverity } from '@/server/cron/settlement-monitor.js';
import { redactError } from '../redact.js';
import type { CheckAdapter, CheckContext, CheckResult } from '../types.js';

export interface DlqDepthRow {
  queueKey: string;
  depth: number;
}
export interface DlqDepthConfig {
  pageThreshold: number;
}

export function evaluateDlqDepth(
  rows: DlqDepthRow[],
  cfg: DlqDepthConfig,
): { severity: AlertSeverity; detail: string } {
  const nonzero = rows.filter((r) => r.depth > 0);
  if (nonzero.length === 0) return { severity: 'info', detail: 'all DLQs drained' };
  const max = Math.max(...nonzero.map((r) => r.depth));
  const sev: AlertSeverity = max >= cfg.pageThreshold ? 'page' : 'warn';
  const detail = nonzero.map((r) => `${r.queueKey}=${r.depth}`).join(', ');
  return { severity: sev, detail: `dead-lettered: ${detail}` };
}

export const dlqDepth: CheckAdapter = {
  key: 'dlq_depth',
  title: 'Dead-letter queue depth',
  defaultConfig: { pageThreshold: 50 },
  defaultIntervalHours: 1,
  enabledByDefault: true, // enabled 2026-06-15 (H4)
  async run(ctx: CheckContext): Promise<CheckResult> {
    const cfg = { pageThreshold: Number(ctx.config.pageThreshold ?? 50) };
    try {
      const db = createDbService({ DATABASE_URL: ctx.env.DATABASE_URL });
      const events = await listDlqEvents(db);
      const rows: DlqDepthRow[] = events.map((e) => ({
        queueKey: e.queueKey,
        depth: Math.max(0, e.deadCount - e.acknowledgedCount),
      }));
      const ev = evaluateDlqDepth(rows, cfg);
      const metrics: Record<string, number> = {};
      for (const r of rows) metrics[r.queueKey] = r.depth;
      return {
        key: this.key,
        severity: ev.severity,
        title: this.title,
        detail: ev.detail,
        metrics,
      };
    } catch (err) {
      return {
        key: this.key,
        severity: 'warn',
        degraded: true,
        title: this.title,
        detail: redactError(err, 'check threw'),
      };
    }
  },
};
