// ==========================================================================
// AVISO: este arquivo NAO esta ligado ao index.js ainda, e NAO foi testado
// de ponta a ponta contra um binlog real. E so o esqueleto de como ficaria
// a sincronizacao "quase instantanea" (ao inves de esperar o ciclo de
// 10min ou o poll de "sincronizar agora"), usando a lib zongji pra ler o
// binlog do MySQL do cliente. Antes de usar em producao:
//   1. Rodar cliente/ativar_binlog.bat no MySQL do cliente (liga log_bin,
//      binlog_format=ROW, server-id)
//   2. Rodar cliente/criar_usuario_replicacao.sql (cria o usuario que le
//      o binlog, com REPLICATION SLAVE/REPLICATION CLIENT)
//   3. Testar isoladamente (fazer um UPDATE numa tabela e confirmar que o
//      evento chega aqui) antes de plugar no sincronizarTudo() do index.js
// ==========================================================================
const ZongJi = require("@vlasky/zongji");

const TABELAS_MONITORADAS = [
  "caixa", "caixa_fechamento",
  "itens_receber", "itens_pagar",
  "vendas", "compras",
  "produtos_estoque",
];

function iniciarListenerBinlog(dbConfig, aoDetectarMudanca) {
  const zongji = new ZongJi({
    host: dbConfig.host,
    port: dbConfig.port,
    user: dbConfig.user,
    password: dbConfig.password,
  });

  let timeoutDebounce = null;

  zongji.on("binlog", (evt) => {
    const tabela = evt.tableMap && evt.tableMap[evt.tableId] ? evt.tableMap[evt.tableId].tableName : null;
    if (!tabela || !TABELAS_MONITORADAS.includes(tabela)) return;

    // Debounce: varias mudancas seguidas (ex: fechar uma venda com 10 itens)
    // disparam varios eventos -- espera 2s de silencio antes de sincronizar,
    // pra nao mandar 10 sincronizacoes completas em sequencia por 1 acao so.
    clearTimeout(timeoutDebounce);
    timeoutDebounce = setTimeout(() => aoDetectarMudanca(tabela), 2000);
  });

  zongji.on("error", (err) => {
    console.error("Erro no listener de binlog:", err.message);
  });

  zongji.start({
    includeEvents: ["writerows", "updaterows", "deleterows"],
    includeSchema: { [dbConfig.database]: TABELAS_MONITORADAS },
  });

  return zongji;
}

module.exports = { iniciarListenerBinlog };
