from django.db.models import Exists, OuterRef

from biscuit.apps.chronos.models import Lesson, LessonPeriod
from biscuit.apps.chronos.util import CalendarWeek
from biscuit.core.models import Group, Person

from .models import PersonalNote


@Person.property
def lessons_as_participant(self):
    return Lesson.objects.filter(groups__members=self)


@Person.property
def lesson_periods_as_participant(self):
    return LessonPeriod.objects.filter(lesson__groups__members=self)


@Person.property
def lesson_periods_as_teacher(self):
    return LessonPeriod.objects.filter(lesson__teachers=self)


@LessonPeriod.method
def personal_notes(self, wanted_week: CalendarWeek):
    # Find all persons in the associated groups that do not yet have a personal note for this lesson
    missing_persons = Person.objects.annotate(
        no_personal_notes=~Exists(PersonalNote.objects.filter(
            week=wanted_week.week,
            lesson_period=self,
            person__pk=OuterRef('pk')
        ))
    ).filter(
        member_of__in=Group.objects.filter(pk__in=self.lesson.groups.all()),
        is_active=True,
        no_personal_notes=True
    )

    # Create all missing personal notes
    PersonalNote.objects.bulk_create([
        PersonalNote(person=person, lesson_period=self,
                     week=wanted_week.week) for person in missing_persons
    ])

    return PersonalNote.objects.select_related('person').filter(
        lesson_period=self, week=wanted_week.week)