-- ============================================================================
-- Endurece uma cópia ANONIMIZADA para o ambiente de teste PÚBLICO
-- (sistema.franquiabv.xyz). MySQL.
--
-- Aplicado duas vezes, e é idempotente: por scripts/exportar-base-teste.sh, na
-- sua máquina, antes de o dump sair dela; e de novo pelo
-- `scripts/deploy-teste.sh base`, no servidor, antes de o site voltar ao ar. A
-- senha dos colaboradores NÃO está aqui: o servidor a troca por uma aleatória,
-- que só ele conhece.
--
-- O que o anonimizador (scripts/anonimizar.sql.modelo) deixa, e que num
-- endereço público age sobre gente, dinheiro ou dá acesso sem login:
--
--   royalties_faturas  ids e links de cobrança REAIS do Asaas (885 de 890 na
--                      cópia de 24/09/2026) -- clicáveis na tela de faturas
--   unidades.hash      a credencial da exportação pública /api/unidade/vendas*:
--                      o anonimizador a deixa MD5('hash-unidade-<id>'), que
--                      qualquer um calcula -- e as vendas são as reais
--   clientes.hash      a do formulário público de fidelidade, previsível igual
--                      (refeito com 8 caracteres, o tamanho que o formulário aceita)
--   *.hash da VIP Class, arquivos e pesquisas: links de download e de resposta
--                      sem login, que valem na produção (25/09/2026)
--   clientes_sessoes   sessões do aplicativo
--   convenios          e-mail, telefone e o NOME da pessoa de contato
--   assistentes.iframe o HTML de incorporação dos assistentes de produção
--   unidades.iframe_bi a URL do painel de BI com o token, se a coluna existir
--   *.tags, indicacoes, o que o anonimizador só passou a refazer em 25/09/2026:
--   nomes em texto     refeito de novo aqui, para a cópia antiga
--
-- E o TEXTO LIVRE que a equipe digita -- motivos de fechamento da agenda, de
-- retirada do caixa, de cancelamento e de desconto (na venda e POR ITEM), descrições de
-- saída, mensagens --, que o anonimizador não toca: na cópia de 25/09/2026 são
-- 134 mil motivos de fechamento, 62 mil de cancelamento e 22 mil de retirada,
-- e é onde a recepção escreve o nome de quem faltou, adoeceu ou desistiu. O
-- critério é o mesmo do anonimizador para `agendas.observacao`. Aqui ele vira
-- um texto genérico, e o tamanho da tela e dos relatórios continua o mesmo.
-- ============================================================================

SET SQL_SAFE_UPDATES = 0;

UPDATE `royalties_faturas` SET
    `asaas_id` = NULL, `asaas_link_cobranca` = NULL, `asaas_link_boleto` = NULL, `asaas_erro` = NULL;

UPDATE `unidades` SET
    `asaas_id` = NULL, `whatsapp_api_key` = NULL, `whatsapp_instancia` = NULL,
    `hash_anterior` = NULL, `hash_anterior_expira_em` = NULL, `hash_anterior_usado_em` = NULL,
    `hash` = SHA2(CONCAT(`id`, '-', HEX(RANDOM_BYTES(32))), 256);

UPDATE `push_app` SET `unidade_whatsapp_api_key` = NULL, `unidade_whatsapp_instancia` = NULL;

DELETE FROM `clientes_sessoes`;

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,
    `descricao` = CASE WHEN COALESCE(`descricao`, '') <> '' THEN 'Descrição de exemplo.' END;

-- O HASH DO CLIENTE TEM 8 CARACTERES [a-z0-9], como o `Cliente::setHash()` o
-- gera: o formulário de fidelidade recusa qualquer outro tamanho
-- (FidelidadeController, `strlen == 8`). Com o MD5 de 32, a adesão ficava
-- desligada para todos os clientes da cópia.
UPDATE `clientes` SET
    `tags` = LOWER(CONCAT_WS(' ', `nome`, `telefone_sem_mascara`, `email`)),
    `hash` = LOWER(LEFT(REGEXP_REPLACE(TO_BASE64(RANDOM_BYTES(24)), '[^A-Za-z0-9]', ''), 8));

UPDATE `unidades_socios` SET `tags` = LOWER(CONCAT_WS(' ', `nome`, `telefone_sem_mascara`, `email`));

UPDATE `indicacoes` SET `url` = CONCAT('https://exemplo.invalid/fidelidade?id=', `cliente`);

UPDATE `usuarios` SET `senha_php83` = NULL, `salt` = NULL, `token_web` = NULL, `token_trocar_senha` = NULL;

-- ----------------------------------------------------------------------------
-- NOMES QUE O PRÓPRIO SISTEMA ESCREVE EM TEXTO. Os mesmos três do anonimizador
-- (desde 25/09/2026), repetidos para a cópia antiga. "colaborador 12 - <nome>"
-- desfazia o "Colaborador 12" do cadastro.
-- ----------------------------------------------------------------------------
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 %';

-- ----------------------------------------------------------------------------
-- As URLs-capacidade: id + hash abrem sem login, aqui e na produção.
-- ----------------------------------------------------------------------------
UPDATE `arquivos` SET `hash` = SHA2(CONCAT('arq-', `id`, '-', HEX(RANDOM_BYTES(16))), 256);
UPDATE `pesquisas` SET `hash` = LEFT(SHA2(CONCAT('pes-', `id`, '-', HEX(RANDOM_BYTES(16))), 256), 30) WHERE `hash` IS NOT NULL;
UPDATE `vipclass` SET `hash` = SHA2(CONCAT('vc-', `id`, '-', HEX(RANDOM_BYTES(16))), 256) WHERE `hash` IS NOT NULL;
UPDATE `vipclass_aulas` SET `hash` = SHA2(CONCAT('vca-', `id`, '-', HEX(RANDOM_BYTES(16))), 256);
UPDATE `vipclass_materiais` SET `hash` = SHA2(CONCAT('vcm-', `id`, '-', HEX(RANDOM_BYTES(16))), 256);
UPDATE `vipclass_checkpoints_perguntas` SET `hash` = SHA2(CONCAT('vcp-', `id`, '-', HEX(RANDOM_BYTES(16))), 256);
UPDATE `vipclass_checkpoints_respostas` SET `hash` = SHA2(CONCAT('vcr-', `id`, '-', HEX(RANDOM_BYTES(16))), 256);

-- O HTML DE INCORPORAÇÃO dos assistentes é da conta de produção, e a tela o
-- imprime cru (assistentes-usuarios/abrir.phtml).
UPDATE `assistentes` SET `iframe` = '' WHERE `iframe` <> '';

-- O PAINEL DE BI DA UNIDADE (`unidades.iframe_bi`): a URL com o token do Power
-- BI. O mapeamento saiu do código em 09/09/2026, e o anonimizador deixou de
-- zerá-la -- mas a coluna segue no banco da produção. Zerada só se existir: um
-- banco nascido do mysql.sql de hoje não a tem.
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;

-- ----------------------------------------------------------------------------
-- O texto livre (ver o cabeçalho). Vazio continua vazio.
-- ----------------------------------------------------------------------------
UPDATE `agendas_fechamentos` SET `motivo` = 'Motivo de exemplo' WHERE COALESCE(`motivo`, '') <> '';
UPDATE `caixas_retiradas` SET `motivo` = 'Retirada de exemplo' WHERE COALESCE(`motivo`, '') <> '';
UPDATE `vendas` SET `cancelado_motivo` = 'Motivo de exemplo' WHERE COALESCE(`cancelado_motivo`, '') <> '';
UPDATE `vendas` SET `desconto_motivo` = 'Motivo de exemplo' WHERE COALESCE(`desconto_motivo`, '') <> '';
-- O MOTIVO DO DESCONTO É POR ITEM: é aqui que o PDV grava o que a recepção
-- digita ("*Informe o motivo do desconto"), e não em `vendas` (425 linhas). Na
-- cópia de 25/09/2026, 159.668 textos livres, com nome de cliente, de parente
-- e de colaborador -- achado pela segunda revisão do deploy. Fica só o
-- "Convênio <nome>", que o próprio sistema escreve com o nome da empresa
-- (`VendaProdutoService`) -- PELO PREFIXO EXATO, byte a byte. O LIKE
-- 'Conv%nio %' de antes casava ~650 textos digitados ("convenio ...",
-- "CONVENIO ..."): a coluna é utf8mb3_general_ci, e ali o LIKE ignora caixa e
-- acento (terceira revisão do deploy). O `CAST ... AS BINARY` compara bytes, e
-- o "ê" tem os mesmos dois em utf8mb3 e utf8mb4.
UPDATE `vendas_produtos` SET `desconto_motivo` = 'Motivo de exemplo'
WHERE COALESCE(`desconto_motivo`, '') <> ''
  AND CAST(LEFT(`desconto_motivo`, 9) AS BINARY) <> CAST('Convênio ' AS BINARY);
UPDATE `saidas` SET `descricao` = CONCAT('Saída ', `id`) WHERE COALESCE(`descricao`, '') <> '';
UPDATE `saidas_parcelas_pagamentos` SET `observacoes` = 'Observação de exemplo' WHERE COALESCE(`observacoes`, '') <> '';
UPDATE `mensagens` SET `titulo` = CONCAT('Mensagem ', `id`), `conteudo` = 'Conteúdo de exemplo.'
WHERE COALESCE(`titulo`, '') <> '' OR COALESCE(`conteudo`, '') <> '';
UPDATE `sorteios` SET `descricao` = 'Descrição de exemplo.' WHERE COALESCE(`descricao`, '') <> '';
UPDATE `arquivos`
SET `nome_original` = CASE WHEN `nome_original` LIKE '%.%'
                           THEN CONCAT('arquivo-', `id`, '.', SUBSTRING_INDEX(`nome_original`, '.', -1))
                           ELSE CONCAT('arquivo-', `id`) END
WHERE COALESCE(`nome_original`, '') <> '';

SET SQL_SAFE_UPDATES = 1;
