-- 074: Reprocessar contatos queimados por falta de saldo — 2º incidente (09/08/2026).
--
-- Domingo 09/08 ~12:27: o saldo Infobip zerou em pleno disparo e 931 mensagens
-- do OPM299 viraram FAILED com "Not enough credits". O guard de crédito
-- (multibmBalanceGuard + errorKind CREDITS) estava EM PRODUÇÃO e não agiu:
-- neste incidente a recusa veio como status=REJECTED por mensagem DENTRO da
-- resposta do lote — caminho que a classificação atual não cobre (o corte só
-- olha o erro da chamada). Correção do guard vem em commit separado; esta
-- migration resgata o estoque queimado, como a 057 fez no 1º incidente.
--
-- Mesma justificativa de segurança da 057: rejeição por saldo acontece ANTES
-- do envio — é garantia de não-entrega, zero risco de duplicata. Escopo:
-- apenas lotes wa_multibm ainda em processing. Idempotente. Sem impacto na
-- janela móvel (FAILED não conta no budget).
--
-- Sequenciamento com o fallback de 24h (verificado): após o DELETE, o lote
-- passa a ter menos mensagens que contatos e DEIXA de se qualificar em
-- getMultibmCampaignsAwaitingWebhook — o socorro não o finaliza com os
-- queimados dentro; o retry worker retoma o envio no ciclo normal.

BEGIN;

DELETE FROM multibm_messages m
USING campaigns c
WHERE m.campaign_id = c.id
  AND c.service_type = 'wa_multibm'
  AND c.status = 'processing'
  AND m.status = 'FAILED'
  AND m.error_message ILIKE '%not enough credits%';

UPDATE campaigns c
SET failed_count = (
  SELECT COUNT(*) FROM multibm_messages m
  WHERE m.campaign_id = c.id AND m.status = 'FAILED'
)
WHERE c.service_type = 'wa_multibm'
  AND c.status = 'processing';

COMMIT;
