-- ---------------------------------------------------------------------------
-- Varre TODAS as colunas de data do banco atrás de valores que o PostgreSQL
-- recusa.
--
-- Por que existe: `pre-migracao-limpeza.sql` conserta quatro colunas, achadas
-- uma a uma. Em 26/08/2026 apareceu `0000-11-30` em `clientes.data_nascimento`,
-- que não estava na lista — e passou despercebido por um motivo que vale
-- registrar: **a anonimização reescreve `data_nascimento`**, então na base de
-- desenvolvimento o defeito simplesmente não existe.
--
-- Procurar coluna por coluna encontra o que já se sabe. Este script encontra o
-- que não se sabe.
--
-- O PostgreSQL não tem ano zero e recusa a carga. Descobrir aqui custa uma
-- consulta; descobrir no corte custa a janela de migração.
--
-- RODE NA RÉPLICA DO BVIP, que tem dado real. SÓ LEITURA.
--
--   mysql -h 127.0.0.1 -P 3306 -u franquiabv -p franquia_producao \
--     < scripts/medir-datas-invalidas.sql
-- ---------------------------------------------------------------------------

SET SESSION group_concat_max_len = 1048576;

-- Monta um SELECT por coluna de data e junta tudo num UNION ALL. É a forma de
-- varrer o catálogo inteiro com o cliente `mysql` puro, sem script externo.
SELECT GROUP_CONCAT(
           CONCAT(
               'SELECT ''', TABLE_NAME, ''' AS tabela, ''', COLUMN_NAME, ''' AS coluna, ',
               'COUNT(*) AS invalidas, MIN(`', COLUMN_NAME, '`) AS menor_valor ',
               'FROM `', TABLE_NAME, '` WHERE `', COLUMN_NAME, '` < ''1000-01-01'''
           )
           SEPARATOR ' UNION ALL '
       ) INTO @varredura
  FROM information_schema.COLUMNS
 WHERE TABLE_SCHEMA = DATABASE()
   AND DATA_TYPE IN ('date', 'datetime');

SET @varredura = CONCAT(
    'SELECT * FROM (', @varredura, ') t WHERE invalidas > 0 ORDER BY invalidas DESC'
);

PREPARE consulta FROM @varredura;

SELECT '=== colunas de data com valor que o PostgreSQL recusa ===' AS '';
SELECT '(vazio = nenhuma; o pre-migracao-limpeza.sql ja da conta)' AS '';

EXECUTE consulta;

DEALLOCATE PREPARE consulta;

-- ---------------------------------------------------------------------------
-- Bônus: datas de nascimento que são preenchimento, não aniversário.
--
-- Não quebram a migração, mas quebram a campanha: quem tem 12/12 no cadastro
-- recebe parabéns em 12 de dezembro.
-- ---------------------------------------------------------------------------

SELECT '=== datas de nascimento concentradas demais ===' AS '';

SELECT DATE_FORMAT(data_nascimento, '%d/%m')                  AS dia_mes,
       COUNT(*)                                               AS clientes,
       ROUND(COUNT(*) / (SELECT COUNT(*)/366.0 FROM clientes
                          WHERE status = 1 AND data_nascimento IS NOT NULL), 1) AS vezes_o_esperado
  FROM clientes
 WHERE status = 1 AND data_nascimento IS NOT NULL
 GROUP BY dia_mes
HAVING clientes > (SELECT COUNT(*)/366.0*2 FROM clientes
                    WHERE status = 1 AND data_nascimento IS NOT NULL)
 ORDER BY clientes DESC;

SELECT '=== e quantas trazem HORA, que aniversario nao tem ===' AS '';

SELECT COUNT(*) AS com_hora_diferente_de_meia_noite
  FROM clientes
 WHERE status = 1 AND data_nascimento IS NOT NULL
   AND TIME(data_nascimento) <> '00:00:00';
