class ReminderUpdater:
    def __init__(self):
        self.users = []
        self.storage = MongodbService()

    def start(self):
        self.print_status_info()
        while True:
            self.calculation()
            time.sleep(1 * 60 * 60)  # каждый час

    def get_users(self) -> list:
        raise NotImplementedError

    def save_user(self, user: dict):
        raise NotImplementedError

    def calculation(self):
        self.users = self.get_users()

        for user in self.users:

            group = user.get('group')
            if not group:
                continue

            schedule = self.storage.get_schedule(group=group).get('schedule')
            if not schedule:
                continue

            try:
                reminders = calculating_reminder_times(
                    schedule=schedule, time=int(user['notifications']))
            except Exception as e:
                logger.error(e)
                continue
            user['reminders'] = reminders
            self.save_user(user)

    @staticmethod
    def print_status_info():
        raise NotImplementedError
 def __init__(self, bot_platform: Literal['vk', 'tg'], bot):
     self.platform = bot_platform
     self.__check_platform()
     self.bot = bot
     self.storage = MongodbService()
     self.users = []
class Reminder:
    def __init__(self, bot_platform: Literal['vk', 'tg'], bot):
        self.platform = bot_platform
        self.__check_platform()
        self.bot = bot
        self.storage = MongodbService()
        self.users = []

    def sending_notifications(self):
        for user in self.users:
            chat_id = user['chat_id']
            week = user['week']
            day_now = user['day']
            time = user['time']
            group = user['group']
            notifications = user['notifications']

            try:
                schedule = self.storage.get_schedule(group=group)['schedule']
            except Exception as e:
                logger.exception(f'Error (group: {group}):\n{e}')
                continue

            # Получение расписания из нужного дня.
            lessons = tools.get_schedule_from_right_day(schedule=schedule, day_now=day_now)

            # если не нашлось переходем к след user
            if not lessons:
                continue

            lessons_for_reminders = tools.forming_message_text(lessons=lessons, week=week, time=time)

            # если пары не нашлись переходим к след user
            if not lessons_for_reminders:
                continue

            # Отправляем сообщение пользователю
            text = f'Через {notifications} минут пара\n' \
                   f'{lessons_for_reminders}'

            if self.platform == 'tg':
                try:
                    self.bot.send_message(chat_id=chat_id, text=text)
                except Exception as e:
                    logger.exception(f'---TG---\n{e}')
            elif self.platform == 'vk':
                try:
                    logger.info(f'vk send user_id: {chat_id}')
                    self.bot.method('messages.send', {'user_id': chat_id, 'message': text, 'random_id': 0})
                except Exception as e:
                    logger.exception(f'---VK---\n{e}')

    def __check_platform(self):
        """Проверка, что работает для такой платформы"""
        if self.platform == 'vk':
            logger.info('reminders_vk is started')
        elif self.platform == 'tg':
            logger.info('reminders_tg is started')
        else:
            raise ValueError(f'Нет такой платформы: {self.platform}')

    def search_for_reminders(self):
        logger.info(f'{self.platform} сработало')
        # определяем время сейчас
        time_now = datetime.now(TZ_IRKUTSK)
        day_now = datetime.now(TZ_IRKUTSK).strftime('%A').lower()

        # выполняем функцию каждые 60 секунд
        threading.Timer(60, self.search_for_reminders).start()

        # minutes_now = time_now.strftime('%M')

        self.users = []

        # получаем пользователей у которых включены напоминания
        if self.platform == 'vk':
            reminders = self.storage.get_users_with_reminders_vk()
        elif self.platform == 'tg':
            reminders = self.storage.get_users_with_reminders_tg()

        for reminder in reminders:
            week = tools.find_week()

            if 'reminders' not in reminder.keys():
                continue

            # если у пользователя пустой reminders то None
            user_days = reminder['reminders'].get(week)
            if not user_days:
                continue
            # если у пользователя нет ткущего дня, то None
            user_day_reminder_time = user_days.get(day_now.lower())

            # если время совпадает с текущим, добавляем в список на отправку
            if tools.check_that_user_has_reminder_enabled_for_the_current_time(time_now,
                                                                               user_day_reminder_time):
                chat_id = reminder['chat_id']
                group = reminder['group']
                notifications = reminder['notifications']

                user = tools.forming_user_to_submit(chat_id, group, notifications, day_now, time_now, week)
                self.users.append(user)

        # после того как список сформирован, нужно отправить его боту
        self.sending_notifications()
from actions.search.prep_and_group_search import start_search, handler_buttons, search
from actions.search.aud_search import start_search_aud, handler_buttons_aud, handler_buttons_aud_all_results

from tools.logger import logger
from tools.storage import MongodbService
from tools.keyboards import *

from tools import statistics

TG_TOKEN = os.environ.get('TG_TOKEN')

TZ_IRKUTSK = pytz.timezone('Asia/Irkutsk')

bot = telebot.TeleBot(TG_TOKEN)

storage = MongodbService().get_instance()

content_schedule = ['Расписание 🗓', 'Ближайшая пара ⏱', 'Расписание на сегодня 🍏', 'На текущую неделю',
                    'На следующую неделю',
                    'Расписание на завтра 🍎', 'Следующая', 'Текущая', 'Экзамены']

content_main_menu_buttons = ['Основное меню', '<==Назад', 'Другое ⚡']

content_students_registration = ['institute', 'course', 'group']
content_reminder_settings = ['notification_btn', 'del_notifications', 'add_notifications', 'save_notifications']
content_prep_group = ["found_prep", "prep_list"]
content_aud = ["search_aud", "menu_aud"]


# ==================== Обработка команд ==================== #
 def __init__(self):
     self.users = []
     self.storage = MongodbService()