-- ---------------------------------------------------------------------------
-- Mede a exposição a uma parada, para escolher as metas de RPO e RTO (F1.2).
--
--   docker compose exec -T mysql mysql -uroot -proot franquiabv_dev -t \
--     < scripts/medir-exposicao-parada.sql
--
-- Traduz "quanto se pode perder" e "em quanto tempo precisa voltar" de opinião
-- para número: quantas vendas e quanto dinheiro passam pelo sistema por minuto
-- no pior momento da semana.
--
-- O filtro id < 90000000 exclui as fixtures de teste. status = 1 é venda
-- finalizada.
-- ---------------------------------------------------------------------------

SELECT '=== 1. periodo coberto pelos dados ===' AS '';

SELECT MIN(DATE(data_criacao)) AS primeira,
       MAX(DATE(data_criacao)) AS ultima,
       COUNT(*)                AS vendas_finalizadas
  FROM vendas
 WHERE status = 1 AND id < 90000000;

SELECT '=== 2. movimento diario (ultimos 90 dias) ===' AS '';

SELECT ROUND(AVG(n))    AS vendas_dia_media,
       MAX(n)           AS vendas_dia_pico,
       ROUND(AVG(v), 2) AS faturamento_dia_medio,
       ROUND(MAX(v), 2) AS faturamento_dia_pico
  FROM (
        SELECT DATE(data_criacao) d, COUNT(*) n, SUM(valor_total) v
          FROM vendas
         WHERE status = 1 AND id < 90000000
           AND data_criacao >= (SELECT MAX(data_criacao) - INTERVAL 90 DAY
                                  FROM vendas WHERE status = 1 AND id < 90000000)
         GROUP BY d
       ) x;

SELECT '=== 3. hora do dia: onde dói mais uma parada ===' AS '';

SELECT HOUR(data_criacao)                          AS hora,
       COUNT(*)                                    AS vendas,
       ROUND(COUNT(*) / COUNT(DISTINCT DATE(data_criacao)), 1) AS vendas_por_dia_nesta_hora,
       ROUND(SUM(valor_total) / COUNT(DISTINCT DATE(data_criacao)), 2) AS faturamento_por_dia_nesta_hora
  FROM vendas
 WHERE status = 1 AND id < 90000000
   AND data_criacao >= (SELECT MAX(data_criacao) - INTERVAL 90 DAY
                          FROM vendas WHERE status = 1 AND id < 90000000)
 GROUP BY hora
 ORDER BY vendas DESC
 LIMIT 6;

SELECT '=== 4. dia da semana ===' AS '';

SELECT DAYNAME(data_criacao)                                   AS dia,
       ROUND(COUNT(*) / COUNT(DISTINCT DATE(data_criacao)), 1) AS vendas_media,
       ROUND(SUM(valor_total) / COUNT(DISTINCT DATE(data_criacao)), 2) AS faturamento_medio
  FROM vendas
 WHERE status = 1 AND id < 90000000
   AND data_criacao >= (SELECT MAX(data_criacao) - INTERVAL 90 DAY
                          FROM vendas WHERE status = 1 AND id < 90000000)
 GROUP BY dia, DAYOFWEEK(data_criacao)
 ORDER BY DAYOFWEEK(data_criacao);

SELECT '=== 5. O NUMERO QUE DECIDE: pico real por minuto ===' AS '';
SELECT '    RPO: o que se perde por segundo de replicacao atrasada' AS '';
SELECT '    RTO: o que fica represado por minuto de parada' AS '';

SELECT ROUND(AVG(n), 2)  AS vendas_por_minuto_media,
       MAX(n)            AS vendas_no_minuto_mais_cheio,
       ROUND(AVG(v), 2)  AS valor_por_minuto_medio,
       ROUND(MAX(v), 2)  AS valor_no_minuto_mais_cheio
  FROM (
        SELECT DATE_FORMAT(data_criacao, '%Y-%m-%d %H:%i') m,
               COUNT(*) n, SUM(valor_total) v
          FROM vendas
         WHERE status = 1 AND id < 90000000
           AND data_criacao >= (SELECT MAX(data_criacao) - INTERVAL 90 DAY
                                  FROM vendas WHERE status = 1 AND id < 90000000)
         GROUP BY m
       ) y;

SELECT '=== 6. agendamentos: a outra metade da dor ===' AS '';

-- A FAIXA DE FIXTURE FALTAVA AQUI, e só aqui (D167). As quatro âncoras sobre
-- `vendas` acima já a excluem; esta, sobre `agendas`, não excluía -- nem na
-- contagem nem no `MAX` que ancora os 90 dias. Hoje não muda número: as 3
-- agendas de fixture são de 2026-01-01 e o máximo real é 2026-08-16, então os
-- 122.079 saem iguais dos dois jeitos. Mas a âncora é o caso grave: uma linha
-- de fixture com data À FRENTE desloca a janela inteira, e o erro não fica
-- proporcional ao tamanho da contaminação. Foi o que aconteceu em
-- `medir-comandas-abandonadas.sql`, onde UMA venda de fixture de 2026-09-09
-- jogou a janela 24 dias adiante e comeu 177 das 3.332 comandas (5,3%).
SELECT ROUND(COUNT(*) / COUNT(DISTINCT DATE(data_criacao)), 1) AS agendamentos_por_dia
  FROM agendas
 WHERE id < 90000000
   AND data_criacao >= (SELECT MAX(data_criacao) - INTERVAL 90 DAY FROM agendas WHERE id < 90000000);
