"""
Business logic services for the courses app.
"""
from django.utils import timezone

from apps.courses.models import Course, Module, UserCourseProgress


def get_published_courses():
    """Return all published, active exam tracks."""
    return (
        Course.objects.filter(status='published', is_active=True)
        .select_related('category', 'certificate_template')
        .prefetch_related('teachers')
    )


def get_teacher_courses(teacher):
    """Return all courses assigned to a specific teacher."""
    return Course.objects.filter(teachers=teacher).order_by('-created_at')


def create_course(form_data, teacher):
    """
    Create a new course and assign the creating teacher.
    Returns the created course instance.
    """
    course = form_data.save(commit=False)
    course.save()
    course.teachers.add(teacher)
    return course


def update_course(course, form_data):
    """Update an existing course."""
    return form_data.save()


def can_teacher_edit_course(teacher, course):
    """Check if a teacher is allowed to edit a specific teacher course."""
    return course.teachers.filter(pk=teacher.pk).exists()


def mark_module_complete(user, module):
    """Mark a Learning Path module complete for the user."""
    progress, _ = UserCourseProgress.objects.get_or_create(
        user=user,
        course=module.course,
        module=module,
    )
    if not progress.completed_at:
        progress.completed_at = timezone.now()
        progress.save(update_fields=['completed_at'])
    return progress


def get_completed_module_ids(user, course):
    if not user.is_authenticated:
        return set()
    return set(
        UserCourseProgress.objects.filter(
            user=user,
            course=course,
            completed_at__isnull=False,
        ).values_list('module_id', flat=True)
    )
