-- ---------------------------------------------------------------------------
-- O rastro do WhatsApp da unidade: `unidades_whatsapp_eventos` (23/10/2026, a
-- fatia 32 da fila das telas que faltam, WHATSAPP-RASTRO; a F3 de
-- `docs/f3-telas-restantes/tela-whatsapp.md`, pela resposta 136 (a) do dono). Quem
-- gerou o codigo QR e quem desconectou o WhatsApp de cada unidade, e quando: antes
-- dela, nao havia registro nenhum (o W3 do desenho).
--
--   mysql franquia_producao < scripts/migracao-unidades-whatsapp-eventos.sql
--
-- Roda no laco do passo 0 de `docs/procedimento-de-corte.md`, em PRODUCAO, e no
-- laco da copia do desenvolvimento de `docs/ensaio-geral-do-corte.md`, contra a
-- `franquiabv_dev`; os bancos da suite ja nascem com a tabela (`mysql.sql`, e o
-- `postgres/schema.sql` do gerador). NA COPIA LOCAL DESDE 23/10/2026, nos dois
-- bancos, pela resposta 83 do dono (a opcao (a): o esquema que so acrescenta entra
-- nas duas copias locais quando a resposta pedir). A base do teste do BVIP fica sem
-- ela ate a proxima copia exportada daqui, pela mao do dono.
--
-- O QUE ELA GUARDA. Cada pedido de codigo e cada desconexao que passou pelas guardas
-- e chegou ao provedor -- pelas duas portas: a tela antiga
-- (`/mod-configuracoes/whatsapp/codigo` e `/desconectar`) e a API nova
-- (`POST /adm/api/whatsapp/conexao` e `/desconexao`) -- vira uma linha:
--
--   unidade      a unidade da sessao (chave estrangeira para `unidades`);
--   evento       `codigo_pedido` ou `desconexao`;
--   resultado    `sucesso` ou `falha`;
--   motivo       o motivo TRATADO da falha (`RegraDaConexaoWhatsApp`: tempo_esgotado,
--                sem_conexao, chave_recusada, instancia_inexistente, erro_do_provedor,
--                estado_desconhecido); nulo no sucesso. NUNCA o texto do provedor, a
--                chave, a instancia nem o QR;
--   gravado_por, quem pediu: quem entrou na sessao, e a pessoa assumida so quando
--   em_nome_de   difere (`CrudController::autorDaEscrita`). Inteiros sem chave
--                estrangeira, como em `arquivos_acessos`;
--   data         quando, pelo relogio do servidor.
--
-- O QUE NAO GRAVA: a consulta do estado (ler nao e evento), e as recusas que vem
-- antes do provedor ou que o estado decide -- 401, 403 (o privilegio, o papel, a
-- origem), 404, e todo 409 (desligada, fechada, sem credencial, a trava da unidade
-- tomada, ja conectada, iniciando, ja desconectada, nao conectada): nada mudou nem
-- tentou mudar no WhatsApp da unidade. A falha ao gravar nao impede o pedido: fica no
-- log, so com a classe e o SQLSTATE.
--
-- NASCE VAZIA: o que foi pedido antes dela nao esta em lugar nenhum. So ganha linhas;
-- nada aqui as apaga. O PRAZO DE GUARDA, quem pode ver e o aviso aos funcionarios sao
-- da LGPD, que o dono mandou marcar como debito futuro (o D583).
--
-- O INDICE (unidade, data) e a consulta da tela: os ultimos eventos da unidade, do
-- mais novo para o mais antigo. A chave estrangeira de `unidade` usa a primeira coluna
-- dele.
--
-- IDEMPOTENTE: `CREATE TABLE IF NOT EXISTS`. O DDL e o mesmo do `mysql.sql` (menos o
-- `AUTO_INCREMENT=1`), e o portao do passo 0 compara os dois.
--
-- ---------------------------------------------------------------------------
-- ESTA MIGRACAO PRECISA ESTAR EM PRODUCAO ANTES DO PASSO 1 -- o passo 0 (D323).
--
-- O passo 1 refaz o `mysql.sql` a partir da estrutura de producao. Sem a tabela la,
-- ela some do `mysql.sql` e do `schema.sql`, e o pedido de codigo e a desconexao voltam
-- a nao deixar rastro: o codigo pergunta se ela existe (`ISBase\Doctrine\ColunaNoBanco`)
-- e, sem ela, gera o codigo e desconecta como antes, sem quebrar e sem a linha daqui; a
-- `GET /adm/api/whatsapp` devolve `ultimos: null`.
--
-- PARA O CODIGO DE PRODUCAO A TABELA VAZIA E INOFENSIVA: ele nao a le nem a escreve.
-- Cria-la nao copia tabela nenhuma; a chave estrangeira so pede uma trava curta de
-- metadados em `unidades`.
-- ---------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS `unidades_whatsapp_eventos` (
  `id` int NOT NULL AUTO_INCREMENT,
  `unidade` int NOT NULL,
  `evento` varchar(20) NOT NULL COMMENT 'codigo_pedido (gerar o codigo QR) ou desconexao',
  `resultado` varchar(10) NOT NULL COMMENT 'sucesso ou falha',
  `motivo` varchar(30) DEFAULT NULL COMMENT 'O motivo tratado da falha (RegraDaConexaoWhatsApp), nunca o texto do provedor',
  `gravado_por` int NOT NULL COMMENT 'Quem pediu: quem entrou na sessao (CrudController::autorDaEscrita)',
  `em_nome_de` int DEFAULT NULL COMMENT 'A pessoa da sessao, so quando difere de gravado_por (personificacao)',
  `data` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_WHATSAPP_EVENTOS_unidade_data` (`unidade`,`data`),
  CONSTRAINT `FK_UNIDADES_WHATSAPP_EVENTOS_unidade` FOREIGN KEY (`unidade`) REFERENCES `unidades` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

-- Conferencia. O esperado: a tabela, com a chave primaria e o indice.
SELECT index_name                                         AS indice,
       GROUP_CONCAT(column_name ORDER BY seq_in_index)    AS colunas,
       MAX(non_unique)                                    AS nao_unico
  FROM information_schema.statistics
 WHERE table_schema = DATABASE()
   AND table_name = 'unidades_whatsapp_eventos'
 GROUP BY index_name
 ORDER BY index_name;

SELECT COUNT(*) AS eventos FROM unidades_whatsapp_eventos;
