import os
import django
import asyncio
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from django.core.management.base import BaseCommand
from telegram.ext import Application
from bot.utils.bot_setup import setup_bot
from scheduler.tasks import load_tasks_to_scheduler
from settings.models import TelegramSettings

class Command(BaseCommand):
    help = "Запуск Telegram бота и планировщика"

    def handle(self, *args, **options):
        # Установка Django окружения
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "touchh.settings")
        django.setup()

        # Создаем новый цикл событий
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)

        # Настройка планировщика
        scheduler = AsyncIOScheduler(event_loop=loop)
        scheduler.start()

        # Загрузка задач в планировщик
        try:
            load_tasks_to_scheduler(scheduler)
        except Exception as e:
            self.stderr.write(f"Ошибка при загрузке задач в планировщик: {e}")
            return

        # Настройка Telegram бота
        # bot_token = os.getenv("TELEGRAM_BOT_TOKEN")
        bot_token = TelegramSettings.objects.first().bot_token
     
        if not bot_token:
            raise ValueError("Токен бота не найден в переменных окружения.")
        application = Application.builder().token(bot_token).build()
        setup_bot(application)
        # Основная асинхронная функция
        async def main():
            await application.initialize()
            await application.start()
            await application.updater.start_polling()
            self.stdout.write(self.style.SUCCESS("Telegram бот и планировщик успешно запущены."))
            try:
                while True:
                    await asyncio.sleep(3600)
            except asyncio.CancelledError:
                await application.stop()
                scheduler.shutdown()

        # Запуск асинхронной программы
        try:
            loop.run_until_complete(main())
        except KeyboardInterrupt:
            self.stdout.write(self.style.ERROR("Завершение работы Telegram бота и планировщика"))
        finally:
            loop.close()
