-- ---------------------------------------------------------------------------
-- O irmao no PostgreSQL de `scripts/migracao-vipclass-conclusao-unica.sql` (06/11/2026,
-- a fatia 85 da fila das telas que faltam, VIPCLASS-CONCLUSAO-UNICA; o D372), para a
-- COPIA LOCAL de pe. Ele APAGA LINHA: a resposta 213 (a) do dono ja autoriza a limpeza nas
-- duas copias locais ("as 191 linhas a mais saem, nas duas copias locais ja e na producao
-- na etapa 2"), mas a fatia 85 nao a rodou (a ordem dela era so SELECT na franquiabv_dev):
-- rodar e do coordenador, junto com o roteiro do MySQL na copia (o D728).
--
--   docker exec -i franquiabv-postgres-1 sh -c 'psql -U "$POSTGRES_USER" -d franquiabv_dev -v ON_ERROR_STOP=1' \
--     < postgres/migracao-vipclass-conclusao-unica.sql
--
-- O que ela cria e o que `scripts/gerar-ddl-postgres.php` emite no `postgres/schema.sql`
-- pela lista `$unicidades`: a restricao com o `inquilino_id` na frente e o nome que o
-- gerador da (encurtado para os 63 bytes do PostgreSQL). Os bancos da suite e o do
-- contrato nascem do `schema.sql` e nao precisam deste arquivo; em producao, o PostgreSQL
-- nasce do `schema.sql` na janela, depois do passo 3 do MySQL, e tambem nao.
--
-- QUAL LINHA FICA: a mesma regra do MySQL -- a PRIMEIRA de cada par (inquilino, curso,
-- pessoa), a de menor `data` e, no mesmo instante, a de menor `id` (a resposta 213 (a) do
-- dono). Sai toda linha que tem, no mesmo par, outra que a precede; a primeira de cada par
-- nao tem quem a preceda, e nenhum par fica sem linha. Rodado pelo superusuario do
-- conteiner, o RLS nao filtra: todos os inquilinos. Na copia (06/11/2026, so contagens):
-- 2.131 conclusoes, 1.940 pares, 167 repetidos, 191 linhas saem -- os mesmos numeros do
-- MySQL da copia.
--
-- IDEMPOTENTE: sem pares, o DELETE muda zero linhas; a restricao so e criada se ainda nao
-- existe NESTA tabela (`conrelid`, e nao so o nome); numa transacao so.
--
-- PARA DESFAZER: so a restricao sai (`ALTER TABLE vipclass_checkpoints_usuarios DROP
-- CONSTRAINT vipclass_checkpoints_usuarios_inquilino_id_vipclass_usu_691ae94;`); as
-- linhas apagadas so voltam de um dump de antes.
-- ---------------------------------------------------------------------------

BEGIN;

-- ANTES: os pares (inquilino, curso, pessoa), os repetidos, as linhas a mais, e das que
-- saem, quantas tem outra nota e outra data que a primeira.
SELECT (SELECT COUNT(*) FROM (SELECT 1 FROM vipclass_checkpoints_usuarios GROUP BY inquilino_id, vipclass, usuario) t) AS pares,
       (SELECT COUNT(*) FROM (SELECT 1 FROM vipclass_checkpoints_usuarios GROUP BY inquilino_id, vipclass, usuario HAVING COUNT(*) > 1) r) AS pares_repetidos,
       (SELECT COUNT(*) FROM vipclass_checkpoints_usuarios)
         - (SELECT COUNT(*) FROM (SELECT 1 FROM vipclass_checkpoints_usuarios GROUP BY inquilino_id, vipclass, usuario) t) AS linhas_a_mais,
       (SELECT COUNT(*) FROM vipclass_checkpoints_usuarios c
          JOIN vipclass_checkpoints_usuarios f ON f.inquilino_id = c.inquilino_id AND f.vipclass = c.vipclass AND f.usuario = c.usuario
         WHERE c.id <> f.id AND c.nota <> f.nota
           AND NOT EXISTS (SELECT 1 FROM vipclass_checkpoints_usuarios p
                            WHERE p.inquilino_id = f.inquilino_id AND p.vipclass = f.vipclass AND p.usuario = f.usuario
                              AND (p.data < f.data OR (p.data = f.data AND p.id < f.id)))) AS saem_com_outra_nota,
       (SELECT COUNT(*) FROM vipclass_checkpoints_usuarios c
          JOIN vipclass_checkpoints_usuarios f ON f.inquilino_id = c.inquilino_id AND f.vipclass = c.vipclass AND f.usuario = c.usuario
         WHERE c.id <> f.id AND c.data <> f.data
           AND NOT EXISTS (SELECT 1 FROM vipclass_checkpoints_usuarios p
                            WHERE p.inquilino_id = f.inquilino_id AND p.vipclass = f.vipclass AND p.usuario = f.usuario
                              AND (p.data < f.data OR (p.data = f.data AND p.id < f.id)))) AS saem_com_outra_data;

-- AS LINHAS A MAIS: sai toda conclusao que tem, no mesmo par, outra mais antiga -- ou do
-- mesmo instante e de id menor. A primeira de cada par fica.
DELETE FROM vipclass_checkpoints_usuarios c
 USING vipclass_checkpoints_usuarios p
 WHERE p.inquilino_id = c.inquilino_id AND p.vipclass = c.vipclass AND p.usuario = c.usuario
   AND (p.data < c.data OR (p.data = c.data AND p.id < c.id));

-- A CHAVE, com as linhas a mais ja tiradas; na segunda vez, nada.
DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_constraint
                    WHERE conrelid = 'vipclass_checkpoints_usuarios'::regclass
                      AND conname = 'vipclass_checkpoints_usuarios_inquilino_id_vipclass_usu_691ae94') THEN
        ALTER TABLE vipclass_checkpoints_usuarios
            ADD CONSTRAINT vipclass_checkpoints_usuarios_inquilino_id_vipclass_usu_691ae94 UNIQUE (inquilino_id, vipclass, usuario);
    END IF;
END $$;

-- DEPOIS: nenhum par repetido, uma linha por par, e a restricao com as colunas na ordem.
SELECT (SELECT COUNT(*) FROM (SELECT 1 FROM vipclass_checkpoints_usuarios GROUP BY inquilino_id, vipclass, usuario HAVING COUNT(*) > 1) r) AS pares_repetidos,
       (SELECT COUNT(*) FROM (SELECT 1 FROM vipclass_checkpoints_usuarios GROUP BY inquilino_id, vipclass, usuario) t) AS pares,
       (SELECT COUNT(*) FROM vipclass_checkpoints_usuarios) AS linhas,
       (SELECT pg_get_constraintdef(oid) FROM pg_constraint
         WHERE conrelid = 'vipclass_checkpoints_usuarios'::regclass
           AND conname = 'vipclass_checkpoints_usuarios_inquilino_id_vipclass_usu_691ae94') AS restricao;

COMMIT;
