-- 076: Recuperação do OPM299 — o alcance que a 074 devia ter tido (10/08/2026).
--
-- A 074 resgatou mensagens queimadas por "Not enough credits" APENAS em lotes
-- 'processing' (escopo copiado da 057). Só que o OPM299 estava PAUSADO no
-- momento da migration e ficou de fora; ao ser retomado, morreu como 'error'
-- (pool vazio — a submissão Diamantes tinha sido desagrupada manualmente do
-- Template Base, sem log). Os 931 registros seguem lá e os contatos nunca
-- foram finalizados. Esta migration fecha o ciclo em quatro passos:
--
-- 1. Reagrupa a submissão física da Diamantes ao Base Magic3var_link
--    (desagrupamento manual confirmado pelo dono em 10/08, que pediu o
--    reagrupamento para o teste). Assinatura conferida contra produção:
--    3 variáveis, botão https://revr.be/{{1}}, header imagem — compatível.
-- 2. Resgata as mensagens queimadas por saldo em lotes processing/paused/
--    error (o escopo correto). Rejeição por saldo acontece ANTES do envio —
--    garantia de não-entrega, zero risco de duplicata (mesma tese da 057/074).
-- 3. Recontagem do failed_count dos lotes tocados (como na 074).
-- 4. Devolve o OPM299 (e só ele) de 'error' para 'paused': o resume atômico
--    exige paused. Na retomada o pool monta, o guard de categoria vê
--    MARKETING na Diamantes, bane, o pool esvazia sem ban recuperável e o
--    lote é CANCELADO limpo — finalização recomputa contadores das mensagens
--    (fonte da verdade) e estorna os não enviados.
--
-- Idempotente; em dev os UUIDs de produção não existem e os passos 1 e 4
-- afetam 0 linhas.

BEGIN;

-- Passo 1 — revínculo Diamantes → Base Magic3var_link (só se ainda órfã).
UPDATE multibm_template_submissions
SET template_id = '7d184ef7-1891-4a07-9a3b-0475fd34405b', updated_at = NOW()
WHERE id = '6fe1b7f0-7075-4914-8593-a72b44264b02'
  AND template_id IS NULL;

-- Passo 2 — resgate dos queimados por saldo, agora no escopo correto.
DELETE FROM multibm_messages m
USING campaigns c
WHERE m.campaign_id = c.id
  AND c.service_type = 'wa_multibm'
  AND c.status IN ('processing', 'paused', 'error')
  AND m.status = 'FAILED'
  AND m.error_message ILIKE '%not enough credits%';

-- Passo 3 — failed_count volta a contar só falhas reais.
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 IN ('processing', 'paused', 'error');

-- Passo 4 — OPM299 (cirúrgico, por id) volta a ser retomável.
UPDATE campaigns
SET status = 'paused', updated_at = NOW()
WHERE id = 'e6e42759-c498-45d6-ba5f-e6ee20827f87'
  AND status = 'error';

COMMIT;
