from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from core.models import Attendance, ScheduleItem, AcademicDebt, Olympiad
from assignments.models import AssignmentSubmission
from users.models import Student
from .risk_calculator import calculate_student_risk
from .models import RiskPrediction


def update_student_risk(student):
    """Обновить риск для конкретного студента"""
    if not student:
        return

    score, level, factors, rec = calculate_student_risk(student)

    RiskPrediction.objects.update_or_create(
        student=student,
        defaults={
            'risk_score': score,
            'risk_level': level,
            'top_factors': factors,
            'recommended_action': rec
        }
    )


@receiver(post_save, sender=Attendance)
def attendance_saved(sender, instance, **kwargs):
    """При сохранении посещаемости - обновить риск студента"""
    update_student_risk(instance.student)


@receiver(post_delete, sender=Attendance)
def attendance_deleted(sender, instance, **kwargs):
    """При удалении посещаемости - обновить риск студента"""
    update_student_risk(instance.student)


@receiver(post_save, sender=AssignmentSubmission)
def submission_saved(sender, instance, **kwargs):
    """При сохранении сдачи задания - обновить риск студента"""
    update_student_risk(instance.student)


@receiver(post_delete, sender=AssignmentSubmission)
def submission_deleted(sender, instance, **kwargs):
    """При удалении сдачи задания - обновить риск студента"""
    update_student_risk(instance.student)


@receiver(post_save, sender=AcademicDebt)
def debt_saved(sender, instance, **kwargs):
    """При сохранении долга - обновить риск студента"""
    update_student_risk(instance.student)


@receiver(post_delete, sender=AcademicDebt)
def debt_deleted(sender, instance, **kwargs):
    """При удалении долга - обновить риск студента"""
    update_student_risk(instance.student)


@receiver(post_save, sender=Olympiad)
def olympiad_saved(sender, instance, **kwargs):
    """При сохранении олимпиады - обновить риск студента (бонус снижает риск)"""
    update_student_risk(instance.student)


@receiver(post_delete, sender=Olympiad)
def olympiad_deleted(sender, instance, **kwargs):
    """При удалении олимпиады - обновить риск студента"""
    update_student_risk(instance.student)


@receiver(post_save, sender=Student)
def student_saved(sender, instance, **kwargs):
    """При изменении данных студента (стипендия, работа) - обновить риск"""
    update_student_risk(instance)


@receiver(post_save, sender=ScheduleItem)
def schedule_saved(sender, instance, **kwargs):
    """При создании/изменении занятия - обновить риск всех студентов группы"""
    from users.models import Student
    students = Student.objects.filter(group=instance.group)
    for student in students:
        update_student_risk(student)