meta {
  name: 5. Disparar Campanha (Send)
  type: http
  seq: 5
}

post {
  url: {{baseUrl}}/api/campaigns/{{campaignId}}/send
  body: none
  auth: none
}

docs {
  Requer sessão + ser dona da campanha. Sem body.

  ⚠️ **Fluxo 100% síncrono** — a resposta HTTP só volta depois que TODOS os envios (ou tentativas) da lista de contatos terminarem. Provider SES envia sequencialmente com rate-limit (`SES_SEND_RATE_PER_SECOND`); provider SMTP/Nodemailer envia em lotes de 5 (`Promise.allSettled`). Não há fila/worker/background job — em listas grandes isso pode demorar bastante e estourar timeout de função serverless, deixando a campanha "presa" em `SENDING`.

  Pré-condição: `campaign.contactListId` precisa estar definido (setado na criação ou via PATCH) — senão 400 `{"success":false,"error":"Selecione uma lista de contatos antes de disparar a campanha."}`.

  Não há checagem do `status` atual — é possível redisparar uma campanha já `SENT`/`COMPLETED_WITH_ERRORS`; isso reprocessa todos os contatos ativos da lista, resetando os logs existentes para `PENDING`.

  Contatos elegíveis: `status: ACTIVE` + membro da `contactList`. E-mails na suppression list são marcados `FAILED` sem nem chamar o provider.

  Sucesso: 200, `{total, failed, status}` — `status` só pode ser `"SENT"` ou `"COMPLETED_WITH_ERRORS"` (nunca aparece `"SENDING"` na resposta, já que só é lido depois do loop terminar).
}
