import { env } from "../config/env.js";
import { runChatOnce } from "../chat/worker.js";
import { pollAndDispatchReplies } from "../telegram/bridge.js";
import { ping as pingDb, closePool } from "../db/mysql.js";

/**
 * Processo do worker de CHAT (sempre-vivo). A cada ciclo: espelha ordens
 * ativas + chat + automações, e despacha os replies do Telegram de volta às
 * exchanges.
 */

let running = true;

function sleep(ms: number): Promise<void> {
  return new Promise((r) => setTimeout(r, ms));
}

async function cycle(): Promise<void> {
  const stats = await runChatOnce();
  if (stats.newMessages || stats.automationsFired || stats.errors.length) {
    console.log(
      `[chat] contas=${stats.accounts} ordens=${stats.orders} novas=${stats.newMessages} automações=${stats.automationsFired}`,
    );
  }
  for (const e of stats.errors) console.error(`[chat] ${e}`);

  try {
    const dispatched = await pollAndDispatchReplies();
    if (dispatched) console.log(`[chat] ${dispatched} reply(s) do Telegram reenviado(s).`);
  } catch (err) {
    console.error("[chat] telegram:", errMsg(err));
  }
}

async function main(): Promise<void> {
  await pingDb();
  console.log(`[chat] worker iniciado. Intervalo=${env.CHAT_POLL_INTERVAL_MS}ms`);
  while (running) {
    try {
      await cycle();
    } catch (err) {
      console.error("[chat] ciclo falhou:", errMsg(err));
    }
    await sleep(env.CHAT_POLL_INTERVAL_MS);
  }
}

function errMsg(err: unknown): string {
  return err instanceof Error ? err.message : String(err);
}

const shutdown = async (signal: string): Promise<void> => {
  console.log(`[chat] ${signal} recebido, encerrando...`);
  running = false;
  await closePool().catch(() => {});
  process.exit(0);
};
process.on("SIGINT", () => void shutdown("SIGINT"));
process.on("SIGTERM", () => void shutdown("SIGTERM"));

main().catch((err) => {
  console.error("[chat] fatal:", errMsg(err));
  process.exit(1);
});
