/**
 * Cron: Returns SLA Tick — runs on the every-30-minute schedule.
 *
 * Calls processSlaTick() to auto-advance overdue returns through their SLA
 * timeouts (vendor-respond-timeout: auto-approve, buyer-ship-timeout:
 * expire, vendor-inspect-timeout: auto-refund).
 *
 * Payments provider IS wired because sla.vendor_inspect_timeout triggers
 * a refund_executed event which calls executeRefund().
 */

import { createDbService } from '@/server/services/db.js';
import { withSentry } from '@/server/observability/with-sentry';
import { processSlaTick } from '../returns/service.js';
import { getPaymentProvider } from '../payments/get-provider.js';
import type { CronEnv } from './deal-expiry.js';
import type { MultidealEnv } from '@/server/env';

export const runReturnsSla = withSentry(
  async function runReturnsSla(env: CronEnv): Promise<void> {
    const db = createDbService({ DATABASE_URL: env.DATABASE_URL });
    await processSlaTick({
      db,
      // CronEnv and MultidealEnv share all fields referenced by the service.
      // Cast required because ReturnsServiceDeps.env is typed as MultidealEnv
      // (which includes DO bindings absent from the lean CronEnv interface).
      env: env as unknown as MultidealEnv,
      // Lazy provider — constructed only when a refund_executed event fires.
      payments: () => getPaymentProvider(env),
    });

    // Auto-deliver loop removed in T7: shippedAt/deliveredAt columns were
    // on the old purchases table and have no equivalent in orderLine.
  },
  { name: 'cron.returns-sla', kind: 'cron' },
);
