import { Bot } from "grammy";
import { logger } from "./logger";
import { validateCode } from "../modules/telegram/telegram.service";

const token = process.env.BOT_TOKEN;

let botInstance: Bot | null = null;
let botUsername: string | null = null;

export function getBot(): Bot | null {
  return botInstance;
}

export function getBotUsername(): string | null {
  return botUsername;
}

export async function startBot(): Promise<void> {
  if (!token) {
    logger.warn("BOT_TOKEN not set, Telegram bot not started");
    return;
  }

  try {
    const bot = new Bot(token);

    bot.command("start", async (ctx) => {
      await ctx.reply(
        "🔗 Enviá el código de verificación que aparece en la Configuración de la app para conectar tu cuenta de Telegram.\n\nUna vez conectado, recibirás notificaciones cuando BELO alcance el máximo del día.",
      );
    });

    bot.on("message:text", async (ctx) => {
      const text = ctx.message.text.trim();
      if (text.startsWith("/")) return;

      const success = await validateCode(BigInt(ctx.chat.id), text);
      if (success) {
        await ctx.reply("✅ ¡Conectado! Recibirás notificaciones de BELO aquí.");
      } else {
        await ctx.reply("❌ Código inválido o ya utilizado.");
      }
    });

    const botInfo = await bot.api.getMe();
    botUsername = botInfo.username;

    bot.start();
    botInstance = bot;

    logger.info({ botUsername }, "Telegram bot started");
  } catch (error) {
    logger.error(error, "Failed to start Telegram bot");
  }
}
