-- ---------------------------------------------------------------------------
-- Remove a pesquisa de teste de 2018 (id 1).
--
--   docker compose exec -T mysql mysql -uroot -proot franquiabv_dev \
--     < scripts/remover-pesquisa-teste-2018.sql
--
-- A pesquisa 1 é resíduo: título "Cadastro Fidelidade", uma única pergunta com
-- o conteúdo literal "pergunta 1?", criada em 12/01/2018 às 15:14 — quarenta
-- minutos antes da pesquisa 2, que é a de verdade. Está inativa
-- (`status = 0`), não é a do programa de fidelidade
-- (`programa_fidelidade = 0`), e **não tem nenhuma resposta**.
--
-- IDEMPOTENTE: rodar de novo não faz nada e não acusa erro.
--
-- ---------------------------------------------------------------------------
-- POR QUE ESTE SCRIPT É DESCONFIADO DE SI MESMO
--
-- As duas chaves estrangeiras da família são `ON DELETE CASCADE`:
--
--     pesquisas_perguntas.pesquisa  -> pesquisas.id            CASCADE
--     pesquisas_respostas.pergunta  -> pesquisas_perguntas.id  CASCADE
--
-- Ou seja, um `DELETE FROM pesquisas WHERE id = <errado>` levaria junto, **em
-- silêncio**, as perguntas e as 25.471 respostas acumuladas desde 2018 — que
-- são a única forma em que essas respostas existem, porque `pesquisas_respostas`
-- guarda contadores, não linhas por resposta. Não há como recontá-las depois.
--
-- Por isso aqui:
--
--   * apaga-se filho antes de pai, explicitamente, sem depender do CASCADE —
--     assim a intenção fica escrita e um engano não se propaga sozinho;
--   * cada DELETE carrega as condições que identificam ESTA pesquisa, e não
--     apenas o id: inativa, fora do programa de fidelidade, e sem respostas;
--   * se qualquer condição não bater, nada é apagado e a conferência final
--     mostra o quê.
--
-- A trava parece exagerada para duas linhas. Ela existe porque o custo de errar
-- não é proporcional ao tamanho do alvo.
-- ---------------------------------------------------------------------------

-- Guarda: 1 se a pesquisa 1 é mesmo o resíduo esperado, 0 em qualquer outro
-- caso — inclusive se ela já tiver sido removida.
SET @seguro = (
    SELECT COUNT(*)
      FROM pesquisas
     WHERE id = 1
       AND status = 0
       AND programa_fidelidade = 0
       AND NOT EXISTS (
               SELECT 1
                 FROM pesquisas_respostas r
                 JOIN pesquisas_perguntas p ON r.pergunta = p.id
                WHERE p.pesquisa = 1
           )
);

-- As perguntas primeiro. O CASCADE faria isso sozinho; escrever é o ponto.
DELETE FROM pesquisas_perguntas
 WHERE pesquisa = 1
   AND @seguro = 1;

DELETE FROM pesquisas
 WHERE id = 1
   AND @seguro = 1;

-- ---------------------------------------------------------------------------
-- Conferência
--
-- `sobrou_a_pesquisa_1` deve ser 0. `respostas_preservadas` deve continuar em
-- 25.471 — é a asserção que importa, porque é o que o CASCADE poderia ter
-- levado.
-- ---------------------------------------------------------------------------
SELECT
    @seguro                                                        AS guarda_liberou,
    (SELECT COUNT(*) FROM pesquisas WHERE id = 1)                  AS sobrou_a_pesquisa_1,
    (SELECT COUNT(*) FROM pesquisas)                               AS pesquisas_restantes,
    (SELECT COUNT(*) FROM pesquisas_perguntas)                     AS perguntas_restantes,
    (SELECT COALESCE(SUM(total), 0) FROM pesquisas_respostas)      AS respostas_preservadas;
