import { sql } from 'drizzle-orm';
import type { DrizzleClient } from '@/server/db/client.js';
import { dlqEvents } from '@/server/db/schema.js';
import type { DlqEventRecord } from '@/server/db/schema.js';
import { scrubStringValue } from '@/server/observability/pii-scrub.js';

/** Increment a DLQ's dead-letter counter (called by consumers at final-retry / DLQ receipt). */
export async function incrementDeadLetter(
  db: DrizzleClient,
  queueKey: string,
  reason: string,
  now: Date,
): Promise<void> {
  const scrubbed = scrubStringValue(reason).slice(0, 500);
  await db
    .insert(dlqEvents)
    .values({ queueKey, deadCount: 1, lastDeadAt: now, lastReason: scrubbed })
    .onConflictDoUpdate({
      target: dlqEvents.queueKey,
      set: {
        deadCount: sql`${dlqEvents.deadCount} + 1`,
        lastDeadAt: now,
        lastReason: scrubbed,
      },
    });
}

export async function listDlqEvents(db: DrizzleClient): Promise<DlqEventRecord[]> {
  return db.select().from(dlqEvents);
}

/** Admin "clear" — set acknowledged baseline to the current dead_count (history preserved). */
export async function acknowledgeDlq(db: DrizzleClient, queueKey: string): Promise<void> {
  await db
    .update(dlqEvents)
    .set({ acknowledgedCount: sql`${dlqEvents.deadCount}` })
    .where(sql`${dlqEvents.queueKey} = ${queueKey}`);
}
