from telegram import Bot
from django.core.mail import send_mail
from datetime import datetime
from asgiref.sync import sync_to_async
from users.models import User, NotificationSettings


async def send_telegram_notification(user, message):
    """Отправка уведомления через Telegram."""
    if user.chat_id:
        try:
            bot = Bot(token="ВАШ_ТОКЕН")
            await bot.send_message(chat_id=user.chat_id, text=message)
            print(f"Telegram-уведомление отправлено пользователю {user.chat_id}: {message}")
        except Exception as e:
            print(f"Ошибка отправки Telegram-уведомления пользователю {user.chat_id}: {e}")


def send_email_notification(user, message):
    """Отправка уведомления через Email."""
    if user.email:
        try:
            send_mail(
                subject="Уведомление от системы",
                message=message,
                from_email="noreply@yourdomain.com",
                recipient_list=[user.email],
                fail_silently=False,
            )
            print(f"Email-уведомление отправлено на {user.email}: {message}")
        except Exception as e:
            print(f"Ошибка отправки Email-уведомления пользователю {user.email}: {e}")

async def schedule_notifications():
    """Планировщик уведомлений."""
    print("Запуск планировщика уведомлений...")
    now = datetime.now().strftime("%H:%M")

    # Получение всех пользователей
    users = await sync_to_async(list)(User.objects.all())
    for user in users:
        # Получение настроек уведомлений для каждого пользователя
        settings, _ = await sync_to_async(NotificationSettings.objects.get_or_create)(user=user)

        # Проверка времени уведомления
        if settings.notification_time == now:
            message = "Это ваше уведомление от системы."
            if settings.telegram_enabled:
                await send_telegram_notification(user, message)
            if settings.email_enabled:
                send_email_notification(user, message)
                
async def handle_notification_time(update, context):
    """Обработка ввода времени уведомлений."""
    if context.user_data.get("set_time"):
        user_id = update.message.from_user.id
        new_time = update.message.text

        try:
            # Проверяем правильность формата времени
            hour, minute = map(int, new_time.split(":"))
            user = await sync_to_async(User.objects.filter(chat_id=user_id).first)()
            if user:
                # Обновляем настройки уведомлений
                settings, _ = await sync_to_async(NotificationSettings.objects.get_or_create)(user=user)
                settings.notification_time = f"{hour:02}:{minute:02}"
                await sync_to_async(settings.save)()
                print(f"Пользователь {user_id} установил новое время уведомлений: {new_time}")
                await update.message.reply_text(f"Время уведомлений обновлено на {new_time}.")
        except ValueError:
            print(f"Пользователь {user_id} ввёл некорректное время: {new_time}")
            await update.message.reply_text("Неверный формат. Введите время в формате HH:MM.")
        finally:
            context.user_data["set_time"] = False