-- 057: Reprocessar contatos queimados por falta de saldo Infobip (30/07/2026).
--
-- Incidente de 29/07: o saldo da conta compartilhada zerou em pleno disparo e
-- 1.410 mensagens viraram FAILED com "Not enough credits" (OPM286: 1.317,
-- OPM284: 93). Como contato com mensagem registrada não é reenviado (regra
-- anti-duplicação), esses contatos ficariam sem receber para sempre.
--
-- POR QUE É SEGURO REENVIAR (e por que isto NÃO abre precedente para reenviar
-- FAILED genérico): a rejeição por saldo acontece ANTES do envio — a Infobip
-- recusa a requisição; é garantia de não-entrega. Diferente de timeout/
-- indeterminado (onde reenviar arriscaria duplicata), aqui não existe risco.
-- A partir desta data o dispatcher nem grava FAILED nesses casos (errorKind
-- CREDITS ⇒ linha deletada na hora + corte do run); esta migration cobre só o
-- estoque anterior à correção.
--
-- Escopo: apenas campanhas wa_multibm ainda em processing — lote já finalizado
-- teve crédito/relatório fechados e não deve ser reaberto por migration.
--
-- Efeito: os contatos (que seguem 'pending' — status de contato só muda na
-- finalização) voltam a ser elegíveis; o retry worker os envia no ritmo normal
-- da janela quando houver saldo. failed_count é recalculado para o painel não
-- exibir falhas que deixaram de existir. Linhas FAILED não contam na janela
-- móvel de 24h ⇒ zero impacto no budget de capacidade.
--
-- Aplicar com:
--   psql "$DATABASE_URL" -f migrations/057_requeue_credit_failures.sql
-- Idempotente (re-rodar não encontra mais linhas). Rollback: não se aplica
-- (linhas deletadas representavam não-envios; não há estado a restaurar).

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;
