"""
Celery конфигурация для фоновых задач.
"""
import os
from celery import Celery
from celery.schedules import crontab
from celery import signals

# Установка настроек Django для Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

app = Celery('platform')

# Загрузка конфигурации из Django settings с префиксом CELERY_
app.config_from_object('django.conf:settings', namespace='CELERY')

# Автоматическое обнаружение tasks.py в приложениях
app.autodiscover_tasks()


@signals.worker_ready.connect
def on_worker_ready(sender=None, **kwargs):
    """
    Запуск задач при старте Celery worker.
    Обрабатывает накопившиеся занятия, которые нужно обновить.
    """
    from apps.schedule.tasks import start_lessons_automatically
    try:
        # Запускаем задачу синхронно при старте worker, чтобы сразу обработать накопившиеся занятия
        start_lessons_automatically()
        import logging
        logger = logging.getLogger(__name__)
        logger.info('[Celery] Задача start_lessons_automatically выполнена при старте worker')
    except Exception as e:
        import logging
        logger = logging.getLogger(__name__)
        logger.warning(f'[Celery] Ошибка при запуске start_lessons_automatically при старте: {str(e)}')

# Периодические задачи (Celery Beat)
app.conf.beat_schedule = {
    # ============================================
    # ЗАДАЧИ ПОДПИСОК
    # ============================================
    
    # Проверка истекших подписок каждый день в 00:00
    'check-expired-subscriptions': {
        'task': 'apps.subscriptions.tasks.check_expired_subscriptions',
        'schedule': crontab(hour=0, minute=0),  # Каждый день в 00:00
    },
    
    # Отправка предупреждений об истечении подписок каждый день в 10:00
    'send-expiration-warnings': {
        'task': 'apps.subscriptions.tasks.send_expiration_warnings',
        'schedule': crontab(hour=10, minute=0),  # Каждый день в 10:00
    },
    
    # Автопродление подписок каждый день в 02:00
    'auto-renew-subscriptions': {
        'task': 'apps.subscriptions.tasks.auto_renew_subscriptions',
        'schedule': crontab(hour=2, minute=0),  # Каждый день в 02:00
    },
    
    # Сброс месячного использования 1-го числа каждого месяца в 00:00
    'reset-monthly-usage': {
        'task': 'apps.subscriptions.tasks.reset_monthly_usage',
        'schedule': crontab(day_of_month=1, hour=0, minute=0),  # 1-го числа в 00:00
    },
    
    # Очистка старой истории платежей 1-го числа каждого месяца в 03:00
    'cleanup-old-payment-history': {
        'task': 'apps.subscriptions.tasks.cleanup_old_payment_history',
        'schedule': crontab(day_of_month=1, hour=3, minute=0),  # 1-го числа в 03:00
    },
    
    # Генерация отчетов по подпискам 1-го числа каждого месяца в 09:00
    'generate-subscription-reports': {
        'task': 'apps.subscriptions.tasks.generate_subscription_reports',
        'schedule': crontab(day_of_month=1, hour=9, minute=0),  # 1-го числа в 09:00
    },
    
    # ============================================
    # ЗАДАЧИ РАСПИСАНИЯ
    # ============================================

    # Автоматическое начало и завершение занятий по времени (каждую минуту)
    'start-lessons-automatically': {
        'task': 'apps.schedule.tasks.start_lessons_automatically',
        'schedule': 60.0,  # каждые 60 секунд
    },
    
    # Отправка напоминаний о занятиях за 1 час
    'send-lesson-reminders': {
        'task': 'apps.schedule.tasks.send_lesson_reminders',
        'schedule': crontab(minute='*/15'),  # Каждые 15 минут
    },
    
    # Отправка запросов о подтверждении присутствия за 3 часа до занятия
    'send-attendance-confirmation-requests': {
        'task': 'apps.schedule.tasks.send_attendance_confirmation_requests',
        'schedule': crontab(minute='*/10'),  # Каждые 10 минут
    },
    
    # Отправка отложенных уведомлений каждую минуту
    'send-scheduled-notifications': {
        'task': 'apps.notifications.tasks.send_scheduled_notifications',
        'schedule': 60.0,  # Каждые 60 секунд
    },
    
    # Очистка старых уведомлений каждый день в 3:00
    'cleanup-old-notifications': {
        'task': 'apps.notifications.tasks.cleanup_old_notifications',
        'schedule': crontab(hour=3, minute=0),
    },
    
    # Очистка старых файлов домашних заданий каждую неделю
    'cleanup-old-homework-files': {
        'task': 'apps.homework.tasks.cleanup_old_files',
        'schedule': crontab(day_of_week=0, hour=2, minute=0),  # Воскресенье в 2:00
    },
    
    # Автоматическое завершение неактивных видеокомнат (каждые 5 минут)
    'end-inactive-video-rooms': {
        'task': 'apps.video.tasks.end_inactive_rooms',
        'schedule': 300.0,  # каждые 5 минут
    },
    
    # Поддержание 12 будущих занятий для повторяющихся занятий (каждый день в 2:00)
    'maintain-recurring-lessons': {
        'task': 'apps.schedule.tasks.maintain_recurring_lessons',
        'schedule': crontab(hour=2, minute=0),  # Каждый день в 2:00
    },
    
    # Перенос кастомных предметов в общую модель (каждый день в 3:00)
    'promote-mentor-subjects-to-subjects': {
        'task': 'apps.schedule.tasks.promote_mentor_subjects_to_subjects',
        'schedule': crontab(hour=3, minute=0),  # Каждый день в 3:00
    },
    
    # Автоматическое создание бэкапа базы данных каждый день в 2:00
    'backup-database': {
        'task': 'apps.core.tasks.backup_database',
        'schedule': crontab(hour=2, minute=0),  # Каждый день в 2:00
    },
    
    # Очистка старых бэкапов каждый день в 4:00
    'cleanup-old-backups': {
        'task': 'apps.core.tasks.cleanup_old_backups',
        'schedule': crontab(hour=4, minute=0),  # Каждый день в 4:00
    },
    
    # Синхронизация квот хранилища с подписками каждый день в 1:00
    'sync-all-storage-quotas': {
        'task': 'apps.materials.tasks.sync_all_storage_quotas',
        'schedule': crontab(hour=1, minute=0),  # Каждый день в 1:00
    },
    
    # Очистка старых неиспользуемых материалов каждую неделю в воскресенье в 3:00
    'cleanup-old-unused-materials': {
        'task': 'apps.materials.tasks.cleanup_old_unused_materials',
        'schedule': crontab(day_of_week=0, hour=3, minute=0),  # Воскресенье в 3:00
    },
}

@app.task(bind=True, ignore_result=True)
def debug_task(self):
    """Тестовая задача для проверки работы Celery."""
    print(f'Request: {self.request!r}')

