-- Migration v98: Deduplicar perfis e adicionar UNIQUE em perfis.nome
-- Causa: INSERT IGNORE na v97 não bloqueava duplicatas (sem UNIQUE constraint).
-- Esta migration é idempotente — segura rodar mais de uma vez.

SET NAMES utf8mb4;

-- ─────────────────────────────────────────────────────────────────────────────
-- 1. Para cada nome duplicado, mantém o id MENOR e redireciona os demais
-- ─────────────────────────────────────────────────────────────────────────────

-- 1a. Redireciona usuários que estão usando um id duplicado → id canônico
UPDATE usuarios u
JOIN (
    SELECT nome, MIN(id) AS id_canonico
    FROM perfis
    GROUP BY nome
) c ON c.nome = (SELECT nome FROM perfis WHERE id = u.perfil_id)
SET u.perfil_id = c.id_canonico
WHERE u.perfil_id NOT IN (SELECT MIN(id) FROM perfis GROUP BY nome);

-- 1b. Copia permissões dos ids duplicados para o id canônico (INSERT IGNORE
--     respeita a PK composta de perfil_permissoes, não duplica)
INSERT IGNORE INTO perfil_permissoes (perfil_id, permissao_id)
SELECT c.id_canonico, pp.permissao_id
FROM perfil_permissoes pp
JOIN perfis p  ON p.id = pp.perfil_id
JOIN (
    SELECT nome, MIN(id) AS id_canonico
    FROM perfis
    GROUP BY nome
) c ON c.nome = p.nome
WHERE pp.perfil_id <> c.id_canonico;

-- 1c. Remove os perfis duplicados (CASCADE apaga os perfil_permissoes deles)
DELETE FROM perfis
WHERE id NOT IN (
    SELECT id_canonico FROM (
        SELECT MIN(id) AS id_canonico FROM perfis GROUP BY nome
    ) t
);

-- ─────────────────────────────────────────────────────────────────────────────
-- 2. Adiciona UNIQUE em perfis.nome (para INSERT IGNORE funcionar de verdade)
-- ─────────────────────────────────────────────────────────────────────────────
SET @idx = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME   = 'perfis'
      AND INDEX_NAME   = 'uq_perfis_nome'
);
SET @sql = IF(@idx = 0,
    'ALTER TABLE perfis ADD UNIQUE KEY uq_perfis_nome (nome)',
    'SELECT ''uq_perfis_nome ja existe'' AS info'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ─────────────────────────────────────────────────────────────────────────────
-- 3. Adiciona coluna grupo em perfis (se não existir) — usada para agrupar
-- ─────────────────────────────────────────────────────────────────────────────
SET @col = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME   = 'perfis'
      AND COLUMN_NAME  = 'grupo'
);
SET @sql2 = IF(@col = 0,
    'ALTER TABLE perfis ADD COLUMN grupo VARCHAR(80) DEFAULT NULL AFTER descricao',
    'SELECT ''coluna grupo ja existe'' AS info'
);
PREPARE stmt FROM @sql2; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SELECT CONCAT(
    'Perfis restantes: ',
    COUNT(*),
    ' | Duplicatas removidas com sucesso.'
) AS resultado FROM perfis;
