-- ATENÇÃO: este arquivo é um MODELO. NÃO o execute direto.
--
-- O valor de `senha` abaixo é o texto literal __HASH_SENHA_DEV__, e só vira um
-- hash bcrypt quando passa por scripts/anonimizar.sh. Executado direto, ele
-- grava a string literal no lugar do hash: a anonimização parece ter dado
-- certo, imprime "concluída", e NENHUMA senha funciona depois. Aconteceu na
-- carga da homologação em 24/08/2026, depois de 1,26 GB carregados.
--
-- A extensão .modelo existe para que o engano falhe na hora, com "arquivo não
-- encontrado", em vez de silenciosamente. O caminho certo é:
--
--     sh scripts/anonimizar.sh <nome_do_banco>
--
-- ============================================================================
-- Anonimização da base para uso em desenvolvimento e homologação (LGPD)
--
-- NÃO EXECUTE ESTE ARQUIVO DIRETAMENTE. Use scripts/anonimizar.sh, que valida
-- o banco de destino antes de rodar. Este script REESCREVE dados e não tem
-- volta: se apontado para produção, destrói o cadastro de clientes.
--
-- Critérios adotados:
--
--  * Determinístico. Todos os valores derivam do id da linha, então rodar duas
--    vezes produz o mesmo resultado e dumps diferentes continuam comparáveis.
--
--  * Impossível contatar alguém por engano. Telefones usam o prefixo 9 0000,
--    que não é um celular válido no Brasil, e e-mails usam o domínio reservado
--    .invalid (RFC 2606), que não resolve. Isso protege contra o cenário em
--    que um cron de marketing roda por acidente no ambiente de desenvolvimento.
--
--  * O sistema continua se comportando como em produção. Formatos, tamanhos e
--    preenchimento das colunas são preservados, senão telas e relatórios
--    quebram de um jeito que não acontece no servidor.
--
--  * Estado e cidade são preservados; rua, número, complemento, CEP e bairro
--    são substituídos. Isso mantém os relatórios regionais realistas sem
--    manter o endereço de ninguém.
-- ============================================================================

SET SQL_SAFE_UPDATES = 0;

-- ----------------------------------------------------------------------------
-- Clientes
-- ----------------------------------------------------------------------------
UPDATE `clientes` SET
    `nome`                 = CONCAT('Cliente ', `id`),
    `cpf`                  = LPAD(MOD(CONV(SUBSTRING(MD5(CONCAT('cpf', `id`)), 1, 10), 16, 10), 100000000000), 11, '0'),
    `rg`                   = NULL,
    `profissao`            = NULL,
    `telefone`             = CONCAT('(11) 90000-', LPAD(MOD(`id`, 10000), 4, '0')),
    `telefone_sem_mascara` = CONCAT('551190000', LPAD(MOD(`id`, 10000), 4, '0')),
    `telefone_bkp`         = NULL,
    `email`                = CONCAT('cliente', `id`, '@exemplo.invalid'),
    `cep`                  = '00000-000',
    `bairro`               = 'Bairro de Exemplo',
    `logradouro`           = 'Rua de Exemplo',
    `numero`               = CAST(MOD(`id`, 900) + 100 AS CHAR),
    `complemento`          = NULL,
    `data_nascimento`      = DATE_SUB('2005-01-01', INTERVAL MOD(CONV(SUBSTRING(MD5(CONCAT('nasc', `id`)), 1, 6), 16, 10), 18250) DAY),
    `anotacoes`            = NULL,
    -- 8 caracteres, o tamanho que o formulário de fidelidade aceita (25/09/2026).
    `hash`                 = LEFT(MD5(CONCAT('hash-cliente-', `id`)), 8),
    `codigo_app`           = NULL;

-- ----------------------------------------------------------------------------
-- Colaboradores
--
-- Login e senha ficam previsíveis de propósito: sem isso ninguém consegue
-- entrar no ambiente de desenvolvimento. Ver docs/ambiente-desenvolvimento.md.
--   login: user<id>      senha: a definida em anonimizar.sh (padrão dev123456)
-- ----------------------------------------------------------------------------
UPDATE `usuarios` SET
    `nome`                 = CONCAT('Colaborador ', `id`),
    `telefone`             = CONCAT('(11) 90000-', LPAD(MOD(`id`, 10000), 4, '0')),
    `telefone_sem_mascara` = CONCAT('551190000', LPAD(MOD(`id`, 10000), 4, '0')),
    `telefone_bkp`         = NULL,
    `data_nascimento`      = DATE_SUB('2000-01-01', INTERVAL MOD(CONV(SUBSTRING(MD5(CONCAT('unasc', `id`)), 1, 6), 16, 10), 14600) DAY),
    `email`                = CONCAT('colaborador', `id`, '@exemplo.invalid'),
    `login`                = CONCAT('user', `id`),
    `senha`                = '__HASH_SENHA_DEV__',
    `senha_php83`          = NULL,
    `salt`                 = NULL,
    `token_web`            = NULL,
    `token_trocar_senha`   = NULL,
    `onesignal_id`         = NULL,
    `cep`                  = '00000-000',
    `bairro`               = 'Bairro de Exemplo',
    `logradouro`           = 'Rua de Exemplo',
    `numero`               = CAST(MOD(`id`, 900) + 100 AS CHAR),
    `complemento`          = NULL,
    `cpf`                  = LPAD(MOD(CONV(SUBSTRING(MD5(CONCAT('ucpf', `id`)), 1, 10), 16, 10), 100000000000), 11, '0'),
    `cnpj`                 = NULL,
    `inss`                 = NULL;

-- ----------------------------------------------------------------------------
-- Sócios das unidades
-- ----------------------------------------------------------------------------
UPDATE `unidades_socios` SET
    `nome`                 = CONCAT('Sócio ', `id`),
    `cpf`                  = LPAD(MOD(CONV(SUBSTRING(MD5(CONCAT('scpf', `id`)), 1, 10), 16, 10), 100000000000), 11, '0'),
    `profissao`            = NULL,
    `telefone`             = CONCAT('(11) 90000-', LPAD(MOD(`id`, 10000), 4, '0')),
    `telefone_sem_mascara` = CONCAT('551190000', LPAD(MOD(`id`, 10000), 4, '0')),
    `email`                = CONCAT('socio', `id`, '@exemplo.invalid'),
    `cep`                  = '00000-000',
    `bairro`               = 'Bairro de Exemplo',
    `logradouro`           = 'Rua de Exemplo',
    `numero`               = CAST(MOD(`id`, 900) + 100 AS CHAR),
    `complemento`          = NULL,
    `data_nascimento`      = DATE_SUB('2000-01-01', INTERVAL MOD(CONV(SUBSTRING(MD5(CONCAT('snasc', `id`)), 1, 6), 16, 10), 14600) DAY);

-- ----------------------------------------------------------------------------
-- Unidades
--
-- Aqui não é só dado pessoal: a coluna whatsapp_api_key guarda a credencial da
-- API de WhatsApp de cada unidade. É segredo vivo e precisa sair.
--
-- A coluna `iframe_bi` carrega a URL do painel de BI com token embutido. Ela
-- saiu do CÓDIGO em 09/09/2026, com o Power BI, mas segue no banco da produção:
-- é zerada logo abaixo, só se existir (um banco nascido do mysql.sql de hoje não
-- a tem).
-- Nome, endereço e dados de faturamento da unidade são mantidos porque são
-- dados de pessoa jurídica e os relatórios de royalties dependem deles — com
-- exceção do sócio administrador, que é pessoa física.
-- ----------------------------------------------------------------------------
UPDATE `unidades` SET
    `telefone`                   = CONCAT('(11) 90000-', LPAD(MOD(`id`, 10000), 4, '0')),
    `email`                      = CONCAT('unidade', `id`, '@exemplo.invalid'),
    `faturamento_email`          = CONCAT('faturamento', `id`, '@exemplo.invalid'),
    `faturamento_telefone`       = CONCAT('(11) 90000-', LPAD(MOD(`id`, 10000), 4, '0')),
    `faturamento_socio_adm_nome` = CONCAT('Sócio Administrador ', `id`),
    `faturamento_socio_adm_cpf`  = LPAD(MOD(CONV(SUBSTRING(MD5(CONCAT('sacpf', `id`)), 1, 10), 16, 10), 100000000000), 11, '0'),
    `whatsapp_api_key`           = NULL,
    `whatsapp_instancia`         = NULL,
    `asaas_id`                   = NULL,
    `hash`                       = MD5(CONCAT('hash-unidade-', `id`));

SET @zerar_bi = IF(EXISTS(SELECT 1 FROM information_schema.COLUMNS
                           WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'unidades' AND COLUMN_NAME = 'iframe_bi'),
                   'UPDATE `unidades` SET `iframe_bi` = NULL', 'DO 0');
PREPARE zerar_bi FROM @zerar_bi;
EXECUTE zerar_bi;
DEALLOCATE PREPARE zerar_bi;

-- ----------------------------------------------------------------------------
-- Filas e históricos de mensageria
--
-- push_app replica a credencial de WhatsApp da unidade em cada registro e
-- guarda o conteúdo das mensagens enviadas aos clientes.
-- ----------------------------------------------------------------------------
UPDATE `push_app` SET
    `unidade_whatsapp_api_key`   = NULL,
    `unidade_whatsapp_instancia` = NULL,
    `titulo`                     = 'Título de exemplo',
    `conteudo`                   = 'Conteúdo de exemplo.';

-- Notificações enviadas a clientes (texto livre, pode citar nomes).
UPDATE `notificacoes` SET
    `titulo`   = CONCAT('Notificação ', `id`),
    `conteudo` = 'Conteúdo de exemplo.';

-- Observações de agenda: é onde a recepção anota informações sobre o cliente.
UPDATE `agendas` SET `observacao` = NULL WHERE `observacao` IS NOT NULL;
UPDATE `agendas_exclusoes` SET `observacao` = NULL WHERE `observacao` IS NOT NULL;

-- Deliberadamente NÃO anonimizadas:
--   pesquisas_respostas.conteudo  -> são as opções de resposta cadastradas pelo
--                                    admin, não texto do cliente; apagar quebra
--                                    as pesquisas.
--   nps                           -> guarda apenas notas, sem texto livre.
--   unidades.observacao, saidas_* -> dados de pessoa jurídica, úteis nos testes.

-- ---------------------------------------------------------------------------
-- Tabelas descobertas ao exercitar o script contra a base real de 16/08/2026.
-- A primeira versão deixou passar 566 telefones em push_app e a tabela
-- visagismo inteira, com 1.544 nomes e 455 telefones de clientes. O relatório
-- automático não acusou porque só conferia as chaves de WhatsApp.
-- ---------------------------------------------------------------------------

-- push_app.destinatario guarda o telefone de destino da mensagem.
UPDATE `push_app`
SET `destinatario` = CONCAT('5511900000', LPAD(MOD(`id`, 1000), 3, '0'))
WHERE `destinatario` REGEXP '[0-9]{8,}';

-- visagismo captura nome e telefone no atendimento do consultor.
UPDATE `visagismo`
SET `nome`     = CONCAT('Cliente Visagismo ', `id`),
    `telefone` = CONCAT('(11) 90000-', LPAD(MOD(`id`, 10000), 4, '0'))
WHERE `nome` IS NOT NULL OR `telefone` IS NOT NULL;

-- O texto livre do feedback pode conter dado pessoal digitado pelo cliente.
UPDATE `visagismo` SET `feedback_texto` = NULL WHERE `feedback_texto` IS NOT NULL;

-- ----------------------------------------------------------------------------
-- A busca de clientes e de sócios, e as indicações (25/09/2026)
--
-- `tags` é DERIVADA: o sistema a monta com nome, telefone e e-mail no
-- `Cliente::setTags()`, e a busca lê dela (`tags LIKE`). As UPDATEs acima
-- trocam os três campos e NÃO a refaziam: na cópia anonimizada, em 25/09/2026,
-- 241.683 dos 242.152 clientes com tags ainda tinham ali o nome, o telefone e o
-- e-mail REAIS -- e a busca os achava pelo nome verdadeiro. Refeita aqui com os
-- valores já anonimizados, no formato do `setTags()`: minúsculas, separadas por
-- espaço.
--
-- `indicacoes.url` guardava links da produção com o hash do cliente
-- (`franquiabv.com.br/fidelidade?id=...&hash=...`). A coluna é NOT NULL.
-- ----------------------------------------------------------------------------
UPDATE `clientes` SET `tags` = LOWER(CONCAT_WS(' ', `nome`, `telefone_sem_mascara`, `email`));
UPDATE `unidades_socios` SET `tags` = LOWER(CONCAT_WS(' ', `nome`, `telefone_sem_mascara`, `email`));
UPDATE `indicacoes` SET `url` = CONCAT('https://exemplo.invalid/fidelidade?id=', `cliente`);

-- ----------------------------------------------------------------------------
-- Os nomes que o PRÓPRIO SISTEMA escreve em texto (25/09/2026)
--
-- Três lugares gravam o nome da pessoa dentro de uma frase, desde a importação
-- inicial do código, e as UPDATEs acima não os alcançam. Na cópia de
-- 25/09/2026:
--
--   pontuacoes_historicos  "Somou mais 10 ponto(s), indicação do <nome>" (79)
--                          (VendaPagamentoService) e "Resgate de N pontos (...)
--                          realizado pelo colaborador <id> - <nome>" (19.042)
--                          (ClienteService) -- este desfaz o "Colaborador <id>"
--   produtos_estoque       "<nome> cancelou em <data>" (715) (ProdutoService)
--
-- E o convênio: o anonimizador não o tocava, e ele guarda o nome, o e-mail e o
-- telefone da pessoa de contato (34 com contato).
-- ----------------------------------------------------------------------------
UPDATE `pontuacoes_historicos`
SET `descricao` = 'Somou mais 10 ponto(s), indicação de um cliente'
WHERE `descricao` LIKE 'Somou mais 10 ponto(s), indica%';

UPDATE `pontuacoes_historicos`
SET `descricao` = REGEXP_REPLACE(`descricao`, 'realizado pelo colaborador ([0-9]+) - .*$', 'realizado pelo colaborador $1 - Colaborador $1')
WHERE `descricao` LIKE '%realizado pelo colaborador%';

UPDATE `produtos_estoque`
SET `cancelamento_motivo` = REGEXP_REPLACE(`cancelamento_motivo`, '^.* cancelou em ', 'Um colaborador cancelou em ')
WHERE `cancelamento_motivo` LIKE '% cancelou em %';

UPDATE `convenios` SET
    `email`    = CONCAT('convenio', `id`, '@exemplo.invalid'),
    `telefone` = CONCAT('(11) 90000-', LPAD(MOD(`id`, 10000), 4, '0')),
    `contato`  = CASE WHEN COALESCE(`contato`, '') <> '' THEN CONCAT('Contato ', `id`) END;

SET SQL_SAFE_UPDATES = 1;

SELECT 'Anonimização concluída.' AS resultado;
