#!/usr/bin/env python3

import asyncio
import schedule
import time

from logger import setup_logger
from config import DISCORD_CONFIG
from content_processor import ContentProcessor
from site_api import SiteAPI
from telegram_client import TelegramNewsClient
from vk_client import VKClient
from discord_client import DiscordClient


class NewsBot:
    def __init__(self):
        self.logger = setup_logger()
        self.content_processor = ContentProcessor()
        self.site_api = SiteAPI()
        self.telegram_client = TelegramNewsClient(self.content_processor)
        self.vk_client = VKClient(self.content_processor)
        self.discord_client = DiscordClient(self.content_processor)
        
        self.logger.info("Бот инициализирован с модульной архитектурой")
        if DISCORD_CONFIG['enabled']:
            self.logger.info("Discord функциональность включена")
        else:
            self.logger.info("Discord функциональность отключена")
    
    async def run_job(self):
        """Основная задача бота"""
        self.logger.info("Запуск основной задачи бота")
        
        try:
            # Проверка и публикация новых версий скриптов
            self.site_api.check_script_versions(self.content_processor)
            
            # Получение списка новостей
            news_list = self.site_api.get_news()
            
            if news_list:
                self.logger.info(f"Получено {len(news_list)} новостей для обработки")
                
                # Публикация в Telegram
                if self.telegram_client.is_enabled():
                    await self.telegram_client.check_and_publish_news(news_list)
                
                # Публикация в VK
                if self.vk_client.is_enabled():
                    await asyncio.get_event_loop().run_in_executor(
                        None, self.vk_client.check_and_publish_news, news_list
                    )
                
                # Публикация в Discord (если включен)
                if self.discord_client.is_enabled():
                    await self.discord_client.check_and_publish_news(news_list)
            else:
                self.logger.warning("Новостей для обработки не найдено")
        
        except Exception as e:
            self.logger.error(f"Ошибка в основной задаче бота: {e}")
    
    def run_sync_job(self):
        """Синхронная обертка для планировщика"""
        asyncio.run(self.run_job())
    
    def start(self):
        """Запуск бота"""
        self.logger.info("Запуск новостного бота")
        
        # Выполнение задачи при старте
        self.logger.info("Выполнение первоначальной задачи...")
        self.run_sync_job()
        
        # Планирование периодического выполнения
        schedule.every(30).minutes.do(self.run_sync_job)
        
        self.logger.info("Запуск планировщика задач (каждые 30 минут)")
        
        # Основной цикл
        while True:
            schedule.run_pending()
            time.sleep(5)


def main():
    """Точка входа в приложение"""
    bot = NewsBot()
    
    try:
        bot.start()
    except KeyboardInterrupt:
        bot.logger.info("Бот остановлен пользователем")
    except Exception as e:
        bot.logger.error(f"Критическая ошибка бота: {e}")


if __name__ == '__main__':
    main()