import { query } from '../db';
import { logger } from '../logger';
import { finalizeCampaignStatus } from './campaignSender';

/**
 * Pause very old "sending" campaigns (likely crashed worker).
 * Finalize "sending" campaigns that have no pending recipients (crash after loop).
 */
export async function recoverStuckSendingCampaigns(): Promise<void> {
  await query(`
    UPDATE campaigns SET status = 'paused', updated_at = now()
    WHERE status = 'sending' AND updated_at < now() - interval '30 minutes'
  `);

  const orphans = await query<{ id: string }>(`
    SELECT c.id FROM campaigns c
    WHERE c.status = 'sending'
    AND NOT EXISTS (
      SELECT 1 FROM campaign_recipients cr WHERE cr.campaign_id = c.id AND cr.status = 'pending'
    )
    AND EXISTS (SELECT 1 FROM campaign_recipients cr WHERE cr.campaign_id = c.id)
  `);

  for (const row of orphans) {
    try {
      await finalizeCampaignStatus(row.id);
    } catch (e) {
      logger.error({ err: e, campaignId: row.id }, 'recover stuck sending campaign');
    }
  }
}
