import { createDbService } from '@/server/services/db.js';
import { queryStuckRowDistribution, evaluateStuckRows } from '@/server/cron/settlement-monitor.js';
import { redactError } from '../redact.js';
import type { CheckAdapter, CheckContext, CheckResult } from '../types.js';

export const settlementStuckRows: CheckAdapter = {
  key: 'settlement_stuck_rows',
  title: 'Settlement stuck payout rows',
  defaultConfig: {},
  defaultIntervalHours: 6,
  defaultSeverityFloor: undefined,
  async run(ctx: CheckContext): Promise<CheckResult> {
    try {
      const db = createDbService({ DATABASE_URL: ctx.env.DATABASE_URL });
      const { alertable, noAcctCount } = await queryStuckRowDistribution(db);
      const r = evaluateStuckRows(alertable, ctx.now);
      const detail =
        r.reasons.length > 0
          ? r.reasons.join('; ')
          : `enqueued+releasing=${r.enqueuedReleasingCount}, maxAttempts=${r.globalMaxAttempts}, no_acct=${noAcctCount}`;
      return {
        key: this.key,
        severity: r.severity,
        title: this.title,
        detail,
        metrics: {
          enqueuedReleasing: r.enqueuedReleasingCount,
          maxAttempts: r.globalMaxAttempts,
          noAcct: noAcctCount,
        },
      };
    } catch (err) {
      return {
        key: this.key,
        severity: 'warn',
        degraded: true,
        title: this.title,
        detail: redactError(err, 'check threw'),
      };
    }
  },
};
